1. jni----Java Native Interface的缩写,中文即是 java 本地接口。 复制代码
JNI作用是什么
1.使得Java 与 本地其他类型语言(如C、C++)交互 2.在 Java代码 里调用 C、C++等语言的代码 或 C、C++代码调用 Java 代码 复制代码
为什么要有JNI
背景:实际使用中,Java 需要与 本地代码 进行交互 问题:因为 Java 具备跨平台的特点,所以Java 与 本地代码交互的能力非常弱 解决方案: 采用 JNI特性 增强 Java 与 本地代码交互的能力 复制代码
实现步骤
1.在Java中声明Native方法(即需要调用的本地方法) 2.编译上述 Java源文件javac(得到 .class文件) 3.通过 javah 命令导出JNI的头文件(.h文件) 4.使用 Java需要交互的本地代码 实现在 Java中声明的Native方法 4.1.如 Java 需要与 C++ 交互,那么就用C++实现 Java的Native方法 5.编译.so库文件 6. 通过Java命令执行 Java程序,最终实现Java调用本地代码 复制代码
AS实现步骤
第一步 编写代码
在AS的项目中,src/main/java 新建一个类 JniTest(名称按需求填写) 里面内容是(原生C++的方法)比如下: public native String java2C(); 复制代码
第二步 进行编译
cmd 进入到 src/main/java 目录下 执行以下命令 javah -d ../jni 包名(如com.jni.test.JniTest) 回车 会生成一个jni文件夹下的.h文件(com_jni_test_JniTest.h) 复制代码
第三步 编写c/c++的源文件(方法名称必须相同)可以直接找写C++的同事开发。
c++文件
//引入刚才生成的头文件
#include "com_jni_test_JniTest.h"
//复制头文件里的要实现的方法名及其参数
JNIEXPORT jstring JNICALL
Java_com_jni_test_JniTest_java2C(JNIEnv *env, jobject instance) {
// 实现这个方法,返回一个字符串
return env->NewStringUTF("Hello from C++");
}
复制代码
第四步 重新进行rebuild project
在build/intermediates/ndk/debug/Android.mk 文件 copy出来放在jni目录下 复制代码
第五步 在moudle.gradle文件下配置
defaultConfig{
ndk {
moduleName "test"
//so文件名,如果这里配置了so文件名字,
//记得更改Android.mk里的LOCAL_MODULE :字段为 LOCAL_MODULE := test 不然默认名字为app 不一样的话不生效
// abiFilters "armeabi" //指定so文件所支持的CPU类型,如果不写的话,会生成所有的CPU类型的so文件
}
}
android{
externalNativeBuild {
ndkBuild {
path "src/main/jni/Android.mk"//指定Android.mk路径
}
}
}
复制代码
第六步 再次rebuild。
在build/intermediates/ndkBuild/debug/obj/local 生成各个平台的so库。 复制代码
第七步 生成的库文件是以 lib名字.so 命名的。
在最开始的java文件夹下的JavaTest类中 添加如下代码:
static{
System.loadLibrary(“名字”);//注意 这里的名字 不需要添加lib 直接写你生成的so库名字,也不需要后缀名。
}
复制代码
第八步 调用
在Activity中的调用里面的方法 这样就能实现java 与 c++的调用了。 复制代码
配置长久命令到AS的方式
1,打开项目AS 打开设置界面 2.找到Tools/External Tools 3.点击右上角的添加 弹出一个Create Tool的对话框 4.Name javah desc:javah Program:$JDKPath$\bin\javah.exe Arguments: -d jni -classpath $ModuleFileDir$\src\main\Java $FileClass$ Working directory: $ModuleFileDir$\src\main 点击ok 点击apply 点击OK 5.在jni代码类点击右键 找到External Tools 里面有一个你配置的javah 点击 直接生成.h文件。 生层.h文件后面操作详见上面生成代码 后面步骤同上。 复制代码
NDK是什么
Native Development Kit,是 Android的一个 工具 开发包 JNI 与 NDK 无直接关系 ---- NDK属于Android,JNI 属于java 复制代码
作用
快速开发C、 C++的动态库,并自动将so和应用一起打包成 APK 通过 NDK在 Android中 使用 JNI与本地代码(如C、C++)交互 复制代码
使用步骤(必须下载ndk包--可以网上下载也可以在AS下载)
配置 Android NDK环境 创建 Android 项目,并与 NDK进行关联 在 Android 项目中声明所需要调用的 Native方法 使用 Android需要交互的本地代码 实现在Android中声明的Native方法 比如 Android 需要与 C++ 交互,那么就用C++ 实现 Java的Native方法 通过 ndk - bulid 命令编译产生.so库文件 编译 Android Studio 工程,从而实现 Android 调用本地代码 本人用的AS下载的版本AS版本3.4 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First JavaScript Programming
Eric T. Freeman、Elisabeth Robson / O'Reilly Media / 2014-4-10 / USD 49.99
This brain-friendly guide teaches you everything from JavaScript language fundamentals to advanced topics, including objects, functions, and the browser’s document object model. You won’t just be read......一起来看看 《Head First JavaScript Programming》 这本书的介绍吧!
在线进制转换器
各进制数互转换器
RGB HSV 转换
RGB HSV 互转工具