Java Native Interface

JNI

相当于一种桥梁,一种协议。通过Jni可以让java调用C语言或者C++。

image.png


第一个程序

准备工作

安卓NDK开发
**
下载ndk配置环境变量

命令行输入

  1. ndk-build

安卓项目配置
image.png

项目下创建

main目录下创建jni目录

image.png

JAVA 调用 C

  1. 编写带有native声明的方法的Java类
    2. 使用javac命令编译编写的Java类
    3. 使用java -jni **来生成后缀名为.h的头文件
    4. 使用其他语言(C、C++)实现本地方法
    5. 将本地方法编写的文件生成动态链接库

编写Java代码

  1. package art.taoya;
  2. public class JNITools {
  3. static {
  4. System.out.println("NDKLIB");
  5. //设置查找路径为当前项目路径
  6. // System.setProperty("java.library.path", ".");
  7. //加载动态库的名称
  8. // 在这里我们需要加载这个jni so库, 这个Hello名字就是最终编译产出的so的名字,也可以起其他的名字,但必须要和最终的so库名相同。
  9. System.loadLibrary("Hello");
  10. }
  11. public native String hello();
  12. }

写完之后我们,Make Projectimage.png**


编译代码**

  1. taoya javac JNITools.java

生成.h头文件

:::info javah命令
** :::

  1. 用法:
  2. javah [options] <classes>
  3. 其中, [options] 包括:
  4. -o <file> 输出文件 (只能使用 -d -o 之一)
  5. -d <dir> 输出目录
  6. -v -verbose 启用详细输出
  7. -h --help -? 输出帮助信息
  8. -version 输出版本信息
  9. -jni 生成 JNI 样式的标头文件 (默认值)
  10. -force 始终写入输出文件
  11. -classpath <path> 从中加载类的路径
  12. -cp <path> 从中加载类的路径
  13. -bootclasspath <path> 从中加载引导类的路径
  14. <classes> 是使用其全限定名称指定的
  15. (例如, java.lang.Object)。

生成头文件

:::warning Android Studio 自动生成头文件

File -> Setting ->Tools -> External Tools,点击加号添加新的Tools
image.png :::

这就会生成.h文件,这个文件里面的内容是不能被修改的。

image.png

生成的文件存在于 .idea/modules/app/src/main/jni/art_taoya_JNITools.h

基本类型映射

:::warning 基本类型映射
image.png :::

配置动态链接库

在这里我们需要指定编译产出的so库名,如前面指定的Hello。
配置通常有两种方式,一种通过ndk属性进行配置, 另一种通过cmake配置
**

编译完成后可以看到生成的文件。
image.png

image.png

目录结构

Android 特有的文件 :Android.mk Application.mk

在 Android 上编译需要的配置文件,相当于 build.gradle。

Android.mk

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := Hello
  4. LOCAL_SRC_FILES := Hello.c
  5. include $(BUILD_SHARED_LIBRARY)