AndroidStudio下NDK环境设置以及简单示例
要实现JNI编程,首先需要下载NDK,并进行相关的环境配置。
环境配置参考:http://blog.csdn.net/tongseng/article/details/53005123
实例:
1> 新建本地方法
public class MainActivity extends AppCompatActivity { private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.text); mTextView.setText(getStrFromJNI()); } public native String getStrFromJNI(); //调用生成的库,注意库的名字要和/jni/Android.mk一致 static { System.loadLibrary("demo"); } }
2> 编译MainActivity得到头文件
切换到Terminal,进入到MainActivity所在目录下,然后输入命令 “javah -jni -encoding utf-8 包名.类名”。
刷新工程,就可以找到生成的头文件
得到的头文件:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_jnitest_MainActivity */ #ifndef _Included_com_example_jnitest_MainActivity #define _Included_com_example_jnitest_MainActivity #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_jnitest_MainActivity * Method: getStrFromJNI * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_jnitest_MainActivity_getStrFromJNI (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
3> 编写c文件
切换到Project,然后在app目录下新建jni文件夹,并在里面建立一个demo.cpp的c文件
#include <jni.h> #include<string.h> #include"com_example_jnitest_MainActivity.h" JNIEXPORT jstring JNICALL Java_com_example_jnitest_MainActivity_getStrFromJNI(JNIEnv *env,jobject obj) { //c语言写法 //jstring jstr = (*env) -> NewStringUTF(env, cstr); //c++语言写法 jstring jstr = env -> NewStringUTF("Hello form JNI,just a test!"); return jstr; }
3> 添加Android.mk文件
同样在jni目录下新建Android.mk,并编写语法
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 要生成的so库的名称,但实际为libdemo.so LOCAL_MODULE := demo # 要使用的文件,刚才编写的demo.cpp文件 LOCAL_SRC_FILES := demo.cpp include $(BUILD_SHARED_LIBRARY)
4> 编译生成so库
将之前生成的头文件复制到/jni下
切换到Terminal,进入/jni目录,输入命令ndk-build.cmd,编译器会生成对应的库放在/libs目录下
到目前为止,jni的编译就算完成了,在运行程序前,需要检查下面两个配置:
> 在local.properties中加入(一般情况下已经制动添加):
ndk.dir=E\:\\AndroidStudio\\sdk\\ndk-bundle
sdk.dir=E\:\\AndroidStudio\\sdk
> 在在app的build.gradle的android节点下添加:
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
这样,程序就可以正常运行了。