在网上看到一个Android Studio NDK开发教程,觉得不错,转过来跟大家分享,原地址
http://www.2cto.com/kf/201607/526887.html
1.环境的配置就略过了,网上有很多教程
首先新建一个java类JNIUtils.java
publicclassJNIUtils { static{ System.loadLibrary("huazict"); } //java调C中的方法都需要用native声明且方法名必须和c的方法名一样 publicnativeString getString();}然后如下图所示重新Make PRoject一下工程:![]() |

其次就是生成.h文件了
在studio打开Terminal命令行工具,打开步骤是View->Tool Windows->Terminal (或直接按Alt+F12),如下图所示:

然后在命令行中先进入到工程的main目录下
输入命令:javah -d jni -classpath 自己编译后的class文件的绝对路径
例如:javah -d jni -classpath E:/work/MyApplication/stujni/build/intermediates/classes/debug com.huazi.stujni.jni.JNIUtils(注意debug后的空格)

看到上图,图中命令行中是直接进入到了工程的main目录下(在哪个目录下运行就会在哪个目录下自动生成jni文件夹),按回车之后就会在main目录下生成jni文件夹,同时生成.h文件,如下图:

这个文件.h文件不需要做任何修改,默认即可。
现在我们来写一个test的C文件huazict.c同.h文件一样放到jni文件夹下,代码如下:
?
#include"com_huazi_stujni_jni_JNIUtils.h"/** * 上边的引用标签一定是.h的文件名家后缀,方法名一定要和.h文件中的方法名称一样 */JNIEXPORT jstring JNICALL Java_com_huazi_stujni_jni_JNIUtils_getString (JNIEnv *env, jobject obj) { return(*env)->NewStringUTF(env,"这是我测试的jni");} |

最后在构建文件中的默认配置中加上:
//ndk编译生成.so文件 ndk { moduleName"huazict" //生成的so名字//输出指定三种abi体系结构下的so库。 abiFilters"armeabi","armeabi-v7a","x86" } |
配置好之后就执行 Buide-->MakeProject然后就可以运行app了。(这一步一定不能忘记,否则会报错找不到ndk输出路径)到这里,通过jni调C就完成了,现在我们来测试一下,写个TextView显示一下调用的C:
?
| 1234567891011 | publicclassMainActivityextendsAppCompatActivity { @Override protectedvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView)findViewById(R.id.tv); tv.setText(newJNIUtils().getString()); }} |

上边编译完成了,有人会问:我要的是编译后的.so库,别人用的时候直接拿来用就可以了,那编译后的.so库在哪呢?不要着急请看下图:

新闻热点
疑难解答