Java Native Interface
JNI
相当于一种桥梁,一种协议。通过Jni可以让java调用C语言或者C++。
第一个程序
准备工作
安卓NDK开发
**
下载ndk配置环境变量
命令行输入
ndk-build
安卓项目配置
项目下创建
main目录下创建jni目录
JAVA 调用 C
- 编写带有native声明的方法的Java类
2. 使用javac命令编译编写的Java类
3. 使用java -jni **来生成后缀名为.h的头文件
4. 使用其他语言(C、C++)实现本地方法
5. 将本地方法编写的文件生成动态链接库
编写Java代码
package art.taoya;
public class JNITools {
static {
System.out.println("NDKLIB");
//设置查找路径为当前项目路径
// System.setProperty("java.library.path", ".");
//加载动态库的名称
// 在这里我们需要加载这个jni so库, 这个Hello名字就是最终编译产出的so的名字,也可以起其他的名字,但必须要和最终的so库名相同。
System.loadLibrary("Hello");
}
public native String hello();
}
写完之后我们,Make Project**
编译代码**
➜ taoya javac JNITools.java
生成.h头文件
:::info
javah命令
**
:::
用法:
javah [options] <classes>
其中, [options] 包括:
-o <file> 输出文件 (只能使用 -d 或 -o 之一)
-d <dir> 输出目录
-v -verbose 启用详细输出
-h --help -? 输出帮助信息
-version 输出版本信息
-jni 生成 JNI 样式的标头文件 (默认值)
-force 始终写入输出文件
-classpath <path> 从中加载类的路径
-cp <path> 从中加载类的路径
-bootclasspath <path> 从中加载引导类的路径
<classes> 是使用其全限定名称指定的
(例如, java.lang.Object)。
生成头文件
:::warning Android Studio 自动生成头文件
File -> Setting ->Tools -> External Tools,点击加号添加新的Tools
:::
这就会生成.h文件,这个文件里面的内容是不能被修改的。
生成的文件存在于 .idea/modules/app/src/main/jni/art_taoya_JNITools.h
基本类型映射
:::warning
基本类型映射
:::
配置动态链接库
在这里我们需要指定编译产出的so库名,如前面指定的Hello。
配置通常有两种方式,一种通过ndk属性进行配置, 另一种通过cmake配置
**
编译完成后可以看到生成的文件。
目录结构
Android 特有的文件 :Android.mk Application.mk
在 Android 上编译需要的配置文件,相当于 build.gradle。
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Hello
LOCAL_SRC_FILES := Hello.c
include $(BUILD_SHARED_LIBRARY)