JNI 是java 语言调用C/C++函数的接口。与JNI相关的开发工具包是NDK。下面记录Android Studio 里用 java代码调用 JNI的基本过程。当前环境:
Android Studio:3.1.2.
准备
下载NDK:
###1.创建Java类
定义一个工具类,里面定义了native方法:
1 | package cn.qiracle.jnidemo.jni; |
2.创建JNI文件夹
在main文件夹下创建jni文件夹:
3.生成头文件
两种方式:
1.通过命令行
javac JniUtils.java 编译生成 JniUtils.class文件。然后回退到包外目录javah -jni cn.qiracle.jnidemo.jni.JniUtils。将生成的.h文件移动到main下的jni目录下。
2.配置外部工具
点击File - Setting - Tools - External Tools
打开外部工具配置页,点击 +
新建一个工具。
Program: $JDKPath$\bin\javah.exe
Arguments: -classpath . -jni -d $ModuleFileDir$\src\main\jni $FileClass$
Working directory: $ModuleFileDir$\src\main\Java
点击 OK
保存后就新建了一个工具。此时我们右击 JniUtils.java
,在菜单中选择 External Tools - javah
就可以快速生成头文件并放到 jni 目录。
4.编写C代码
在jni目录下新建一个cn_qiracle_jnidemo_jni_JniUtils.cpp文件。内容如下:
1 |
|
这里输出 hello jni
5.创建mk文件
mk 文件用于告诉 ndk-build 该如何编译 c 源码。详情见官方指南。
在jni目录下创建Android.mk:
1 | LOCAL_PATH := $(call my-dir) |
创建 Application.mk
:
1 | APP_MODULES := JniLib |
6.gradle配置
在 module 的 build.gradle 里,amndroid.defaultConfig
下加入下面配置:
1 | ndk { |
6.编译
这里我们配置使用外部工具:
- Program:
D:\SDK\ndk-bundle\build\ndk-build.cmd
(注意这里是ndk-build路径) - Working directory:
$ProjectFileDir$\app\src\main
任意找个第地方右击,选择 External Tools - ndk-build
即可编译 c 源码。成功后可以看见创建了 libs
目录,里面包含了不同平台下的 so 文件。
7.验证
在MainActivity.java里调用native方法:
1 | Toast.makeText(this,JniUtils.getJniString(),Toast.LENGTH_SHORT).show(); |
运行结果:
参考: