关于Android的NDK开发你需要了解的
JNI,JNI(Java Native Inteface)是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。尤其是c/c++,但是并不妨碍你使用其他语言,只要调用约定支持就可以了。
这里,将详细记录我的NDK开发的踩坑之路。
NDK开发环境的配置
一 ,Android Studio中早已支持NDK的导入,AS版本上的环境配置。
当你在项目中使用的时候
做完上面这一部的话,你可以去你的SDK路径下去看看了,你将看到
E:\AndroidSDK\sdk\ndk-bundle
的路径,很好了,NDK你已经下载完毕。(这里自动下载最新版的)
二 ,当然你自己也可以去NDK的官网下载最新版的NDK。
下载到自己容易找到到的目录。
三,对于前两种的下载方式,希望选择第一种,因为还能下载调试工具,虽然我不讲,但以后会用到的。剩下的我们就是在系统的环境变量中配置NDK路径。
路径就这样也就配置好了。
四,我们在DOS操作界面检测一下,你输入
ndk-build
出现上面的信息的话也就证明你的环境成功了。
在Android Studio中使用
上面我们已经配置了好了环境,接下来就一步步带你实现自己的JNI开发的第一步!
一,在app级别的build文件中
defaultConfig {
applicationId "com.example.administrator.myndkceshi"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//以下两条需加入
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
}
ndk {
moduleName 'helloword'
}
同步一下,看下出错什么的吗,如果出错,请检查上面的AS的环境配置中的第二张截图,选择了NDK目录了吗。
还有根据提示需要在gradle.properties中设置android.useDeprecatedNdk=true。
二,创建你调用So库的CLass,因为你现在还没有根据 .C文件生成,我们先写上,调用native的方法吧。
这里会提示当前没有 HelloWord这个方法。不着急,我们慢慢来。
这里,我们在main 目录下创建 jni 的目录 ,为下一步在此目录生成相应文件。
三,接下来我们应该根据这个Class 生成相应的 .h 文件,它的语法规则很麻烦,但我们可以不去掌握的它的生成规则。可以利用 javah 自动生成
记住,这里一定要在你的 app 目录级别下去生成(我是这么做的,其他也能生成,但感觉这样好记忆一点)
javah -d src/main/jni/ -classpath build/intermediates/classes/debug/ com.example.administrator.myndkceshi.HelloJni
//-d 指定生成的目录路径
// -classpath build build之后,会在debug目录下生成.class文件的
//最后面就是你的完整类名了
如果这里出现问题,请你更换下自己moudel的名字,也就成功了。
四,.h文件生成完毕,我们就开始 做 .c文件了
.c文件
#include "com_example_administrator_myndkceshi_HelloJni.h"
JNIEXPORT jint JNICALL
Java_com_example_administrator_myndkceshi_HelloJni_HelloWord(JNIEnv *env, jobject instance, jint a) {
if (a >10) {
return 100;
}
if(a<10){
return 300;
}
return 400;
}
Application.mk文件
APP_MODULES := helloword
APP_ABI :=all
Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=helloword
LOCAL_SRC_FILES =: com_example_administrator_myndkceshi_HelloJni.c
include $(BUILD_SHARED_LIBRARY)
仔细看,我们注意到包名有所变化,写的.c文件 也不用我们太关心,只要 .h文件是正常的请求头就好。
五,到这一步,我们的 jni 调试已经完成了一大半了,剩下的就开始编译吧。
我们从 Dos界面 进入到 jni目录
在此目录下执行操作
ndk-build
你可能在AS下直接用它的 terminal 进行操作,不好意思,可能会行不通。看系统了吧。
执行完编译的后 我们会看到以下的目录结构
obj目录你可以删除,我们只保留libs 目录即可。编译完成,你可以正常调用.C文件的方法了。
别忘了,我们还需要在 我们调用的的Class 中 加载编译生成的SO库,
public class HelloJni {
static {
//加载.so类库,加载的名称去掉lib
System.loadLibrary("helloword");
}
public native int HelloWord(int a);
}
OK ,完事,你可以在其他界面调用了。
HelloJni helloJni = new HelloJni();
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(helloJni.HelloWord(220)+"");
本例子虽然简单,但是步骤详细,是你jni开发了解详细步骤的不多见的例文,后面我附上源码,需要的请star.