Android JNI 调用

java jni 的本意是Java Native Interface(java 本地接口), 他是为了方便java调用C, C++等本地代码所封装的一层接口。因为java具有良好的跨平台性,所以在与每个平台的底层交互能力不够强大,于是Java专门提供了Jni专门用于和本地的代码交互,通过Jni用户可以调用C,C++编写的代码。什么是NDK呢? NDK是Android为开发者提供的一个工具集合,通过NDK可以在Android中更方便的通过Jni来访问本地代码。

关于Jni调用本地代码的流程,网上相关教程很多,作为一个开发者不要总是停留在看的表面,要去做,只有把这个流程自己每一步骤弄清楚,才会有新的进步,总是感觉自己看明白了其实有很多坑还没有踩过。

在此把jni调用的相关知识点,总结一下大家一起进步交流:
1.各种环境变量的配置。
关于java环境变量的配置自行百度。在命令行中javac,javah,java -version 这三个命令都准确无误以后才算是配置成功,在这里只提一点,在安装jdk时,安装的推荐的C盘,否则在Windows的注册表中会有一个默认的文件安装目录,在我的电脑环境变量中虽然jdk -bin jre-bin路径正确但是在命令行中输入。 上述三个命令还是不能通过,小问题可能大家不会遇到。。。ndk环境变量配置成功在命令行中运行nkd-build,会提示Android NDK:Could not find application project director!...代表ndk环境变量配置成功。

2.生成jni的头文件。

Android JNI 调用_第1张图片

进入JniUtil该目录下执行javac JniUtil.java 会生成JniUtil.class;
回到java层级目录下 执行javah com.jni.test.JniUtil 会生成 com_jni_test_JniUtil.h
注意javah执行的时全目录。
3.利用C++实现jni方法.
创建和java同层级目录jni。将上一步骤生成的.h文件copy过来。这里我们看一下头文件的具体内容。

Android JNI 调用_第2张图片

这里简单讲一下函数名格式遵循规则Java_包名_类名_方法名,其中Jstring是代表set()String 类型参数,JNIEXPORT,JNICALL,JNIEnv,jobject都是JNI标准中所定义的类型或者宏。新建C++文件,具体测试代码实现jni方法,

Android JNI 调用_第3张图片

4.其他配置:

Android JNI 调用_第4张图片

这时我们需要clean build我们的工程,有的教程上说在gradle.properties 添加android.useDeprecatedNdk=true,编译会直接在build-->ndk-->debug-->lib生成so文件。我这里采取这种方法出现问题:

这里的错误提示意思就是android.useDeprecated=true马上就要失去作用了,还提到了Android.mk文件,Android.mk文件用来告知NDK Build 系统关于Source的信息,关键语句:
LOCAL_MODULE := jnidemo(表示模块的名称)
LOCAL_SRC_FILES := \D:\jnidemo\app\src\main\jni\jnidemo.cpp \(表示参与编译的源文件)
这里的解决办法然后在build-->intermediates-->ndk目录下面找到Android.mk文件,copy到jni目录下;

androidStuido Terminal命令行进入到main层级目录下执行ndk-build 会生成你想要的so文件。

Android JNI 调用_第5张图片

最后一步将so文件copy到你build.gradle(app)中jniLibs.srcDirs = ['libs']指定的目录下,将jni目录删除,编译代码。日志打印成功。

Android JNI 调用_第6张图片

你可能感兴趣的:(android)