AndroidStudio NDK开发
2016-06-17 14:00
423 查看
这篇记录的是如何使用AndroidStudio进行NDK开发
1、首先新建工程,这里取名为TestJNI
2、新建工程完毕后,需要下载NDK,具体方法是,打开File-->Project Structure,如下图所示:
![](http://img.blog.csdn.net/20151223111250250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
然后查看是否安装了NDK,如下图所示:
![](http://img.blog.csdn.net/20151223111510432?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
如果没有下载NDK,上图中的红色框下面会有download链接,点击链接可以下载,或者有下载好的NDK,可以直接在输入框中指定路径,需要注意的是,NDK和SDK的路径中都不要包含空格字符,否则可能会出问题
3、开始写native代码。上面两步都搞定之后,就开始在Activity中写代码了,如下所示:
[java] view
plain copy
print?
package com.test.testjni;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView textView;
static {
/** 加载so库 */
System.loadLibrary("test_jni");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.text_view);
textView.setText(getStringFromJNI());
}
/** 从c/c++代码中得到字符串 */
public native String getStringFromJNI();
}
4、写完上面的代码后,需要Make Project,如下图所示:
![](http://img.blog.csdn.net/20151223111925926?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这一步操作是为了生成Java代码对应的class字节码,有了class文件后,再进行下一步
5、生成native函数对应的头文件。
首先需要将AndroidStudio切换到Project视图,然后拷贝java目录的路径,如下图所示:
![](http://img.blog.csdn.net/20151223112203941?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
然后打开AndroidStudio的Terminal,进入到上一步拷贝的路径,再使用javah命令,生成头文件,如下图所示:
![](http://img.blog.csdn.net/20151223132827058?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这里生成头文件用到了javah命令,上面的命令为:javah -d ../jni com.test.testjni.MainActivity,-d表示生成的头文件所在的目录,这里指定的目录是当前目录的上一层的jni目录,后面跟着的是native方法所在的文件的全路径,执行完上面的javah命令后,可以发现main目录下多了jni目录,且自动生成了一个名为com_test_testjni_MainActivity.h的文件,如下图所示:
![](http://img.blog.csdn.net/20151223133104306?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
com_test_testjni_MainActivity.h文件中自动生成了一些代码,如下:
[cpp] view
plain copy
print?
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_test_testjni_MainActivity */
#ifndef _Included_com_test_testjni_MainActivity
#define _Included_com_test_testjni_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_test_testjni_MainActivity
* Method: getStringFromJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_test_testjni_MainActivity_getStringFromJNI
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
其中的
函数,就是需要我们实现的,对应到MainActivity中的
6、编写c代码
接下来需要在jni目录下新建一个c文件,文件内容如下:
[cpp] view
plain copy
print?
//
// Created by yubo on 2015/12/23.
//
#include "com_test_testjni_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_test_testjni_MainActivity_getStringFromJNI
(JNIEnv *env, jobject obj)
{
return (*env)->NewStringUTF(env, "这段文本来自JNI");
}
7、配置build.gradle文件
打开app目录下的build.gradle文件,在defaultConfig中加入如下配置:
![](http://img.blog.csdn.net/20151223134738494?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
注意这里配置的moduleName,跟我们在MainActivity中
这句代码是一致的。
到这里基本上所有的工作就都完成了,可以开始运行程序了,连接手机后运行程序,界面如下:
1、首先新建工程,这里取名为TestJNI
2、新建工程完毕后,需要下载NDK,具体方法是,打开File-->Project Structure,如下图所示:
然后查看是否安装了NDK,如下图所示:
如果没有下载NDK,上图中的红色框下面会有download链接,点击链接可以下载,或者有下载好的NDK,可以直接在输入框中指定路径,需要注意的是,NDK和SDK的路径中都不要包含空格字符,否则可能会出问题
3、开始写native代码。上面两步都搞定之后,就开始在Activity中写代码了,如下所示:
[java] view
plain copy
print?
package com.test.testjni;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView textView;
static {
/** 加载so库 */
System.loadLibrary("test_jni");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.text_view);
textView.setText(getStringFromJNI());
}
/** 从c/c++代码中得到字符串 */
public native String getStringFromJNI();
}
4、写完上面的代码后,需要Make Project,如下图所示:
这一步操作是为了生成Java代码对应的class字节码,有了class文件后,再进行下一步
5、生成native函数对应的头文件。
首先需要将AndroidStudio切换到Project视图,然后拷贝java目录的路径,如下图所示:
然后打开AndroidStudio的Terminal,进入到上一步拷贝的路径,再使用javah命令,生成头文件,如下图所示:
这里生成头文件用到了javah命令,上面的命令为:javah -d ../jni com.test.testjni.MainActivity,-d表示生成的头文件所在的目录,这里指定的目录是当前目录的上一层的jni目录,后面跟着的是native方法所在的文件的全路径,执行完上面的javah命令后,可以发现main目录下多了jni目录,且自动生成了一个名为com_test_testjni_MainActivity.h的文件,如下图所示:
com_test_testjni_MainActivity.h文件中自动生成了一些代码,如下:
[cpp] view
plain copy
print?
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_test_testjni_MainActivity */
#ifndef _Included_com_test_testjni_MainActivity
#define _Included_com_test_testjni_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_test_testjni_MainActivity
* Method: getStringFromJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_test_testjni_MainActivity_getStringFromJNI
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
其中的
JNIEXPORT jstring JNICALL Java_com_test_testjni_MainActivity_getStringFromJNI (JNIEnv *, jobject);
函数,就是需要我们实现的,对应到MainActivity中的
public native String getStringFromJNI();
6、编写c代码
接下来需要在jni目录下新建一个c文件,文件内容如下:
[cpp] view
plain copy
print?
//
// Created by yubo on 2015/12/23.
//
#include "com_test_testjni_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_test_testjni_MainActivity_getStringFromJNI
(JNIEnv *env, jobject obj)
{
return (*env)->NewStringUTF(env, "这段文本来自JNI");
}
7、配置build.gradle文件
打开app目录下的build.gradle文件,在defaultConfig中加入如下配置:
注意这里配置的moduleName,跟我们在MainActivity中
System.loadLibrary("test_jni");
这句代码是一致的。
到这里基本上所有的工作就都完成了,可以开始运行程序了,连接手机后运行程序,界面如下:
相关文章推荐
- Android开发学习之路--RxAndroid之操作符
- Android ImageView的scaleType属性
- Android开发学习之路--RxAndroid之lambda
- Android 高斯模糊效果从319ms到3ms的优化实现
- Android开发学习之路--RxAndroid之初体验
- Android-LinearGradient实现TextView字体渐变的效果
- Android三种实现自定义ProgressBar的方式介绍
- android listview系列之初步接触listview(一)
- Android传感器(一):传感器列表
- 搭建android框架管理activity类
- Android开发环境配置
- IntentService分析
- android xml中的代码提示不全
- Android自绘动画实现与优化实战——以Tencent OS录音机波形动画为实例
- Android中Selsetor基本使用二,选中时改变按钮背景
- 我的Android进阶之旅------>Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
- Android Studio修改包名
- Android中Selsetor基本使用一,按下时改变按钮背景
- 3D效果的ViewPager
- 【Android】ListView中EditText焦点问题