您的位置:首页 > 移动开发 > Android开发

JNI开发应该是最详细的步骤了

2017-03-29 18:40 253 查看
关于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下载

下载到自己容易找到到的目录。


三,对于前两种的下载方式,希望选择第一种,因为还能下载调试工具,虽然我不讲,但以后会用到的。剩下的我们就是在系统的环境变量中配置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.

JNIDemo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ndk jni native 详细 android