学习使用AndroidStudio中的NDK,在网上看到不少示例,自己照着做了一遍,一些地方作者们没有陈述清楚,于是自己做一遍,记录下来,也方便日后查看。
完整项目源码 https://github.com/JianxunRao/SimpleAndroidNDKDemo
1.创建NDKUtils和NDKTestActivity
前者有一个本地方法getStringFromC();返回一个字符串,这个字符串将要显示在NDKTestActivity中的一个TextView中。
NDKUtils.java
package com.trojx.ndkjnitest; /** * Created by Trojx on 2016/2/21. */ public class NDKUtils { static { System.loadLibrary("JniLibName");//加载库文件 } public native String getStringFromC(); }
NDKTestActivity.java
2. 将文件目录切换为“Project”视图package com.trojx.ndkjnitest; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView;/** * Created by Trojx on 2016/2/21. */public class NDKTestActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ndk_test); TextView textView= (TextView) findViewById(R.id.tv); NDKUtils utils=new NDKUtils(); String stringFromC=utils.getStringFromC(); textView.setText(stringFromC); }}
点击“MakeProject”编译工程,
找到app/build/intermediates/classes/debug这个文件目录。
之后打开Terminal窗口,输入cd app/build/intermediates/classes/debug,接着输入javah -jni com.trojx.ndkjnitest.NDKUtils,这样就能在当前目录下生成一个NDKUtils这个包含本地方法的java类的.h头文件。
接着,在src/main文件夹下新建一个jni文件夹,再将生成的.h文件剪切到这个目录中,如图所示。
com_trojx_ndkjnitest_NDKUtils.h
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_trojx_ndkjnitest_NDKUtils */ #ifndef _Included_com_trojx_ndkjnitest_NDKUtils #define _Included_com_trojx_ndkjnitest_NDKUtils #ifdef __cplusplus extern "C" { #endif /* * Class: com_trojx_ndkjnitest_NDKUtils * Method: getStringFromC * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_trojx_ndkjnitest_NDKUtils_getStringFromC (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endifjnitest.c
// // Created by Trojx on 2016/2/21. // #include "com_trojx_ndkjnitest_NDKUtils.h" JNIEXPORT jstring JNICALL Java_com_trojx_ndkjnitest_NDKUtils_getStringFromC (JNIEnv *env, jobject obj){ return (*env)->NewStringUTF(env,"String From C"); }
3.编写c代码实现本地方法,在jni目录新建一个c文件,这里命名它为jnitest.c 。注意,由于AndroidStudio存在一个已知的BUG,我们需要在jni目录新建一个空的c文件再能防止编译时报错。
4.在local.properties文件中添加NDK的地址,如下所示:
5.在build.gradle文件中加入以下两项,添加第二项的原因见这里,如图所示:
6.这时编译还有可能报如下错误,这是因为没有允许使用过时的NDK导致的,在gradle.properties文件中添加一行android.useDeprecatedNdk=true,如图所示:
7.最后编译运行,效果如图所示: