JNI简述
JNI 全称 Java Native Interface , 它提供了若干的API 实现了Java和其他语言的通信(主要是C/C++])
废话不多说直接上图
本文做一个简单的计算
1.新建一个普通的Android项目
2.新建jni类
和普通的类没有什么区别,定以native方法。
3.生成h.头文件(这个头文件主要是规范.c文件的编写)
首先build代码,生成Testjni.class
Android Studio 生成的.class 看图
利用javah 生成.h的头文件
利用A S的命令控制器 cd到Debug文件夹
然后根据javah生成头文件
(一定要cd到 有com文件夹 然后在javah 要不会类找不到,EC 要早src下面执行javah)
4.利用头文件编写JNI
我们需要的只有画红线的部分
然后编写.c文件
拷贝画红线的部分
然后新建文件夹jni(建议将生成的头文件拷贝到jni目录,方便管理)
创建.c文件
直接将头文件里面的方法拷贝过来 ,注意(生成的头文件只有参数类型,并没有参数名,前两个都是固定的写法)
5.利用.c文件生成本地代码库
1.编写Android.mk(.mk文件都是固定的写法)
LOCAL_PATH := $(call my-dir) #指定当前路径
include $(CLEAR_VARS) #清除全局配置
LOCAL_MODULE := calc #生成so库 libcalc.so
LOCAL_SRC_FILES := calc.c #要生成so库的源码
include $(BUILD_SHARED_LIBRARY) #编译成共享库
LOCAL_SRC_FILES 一定要和.c文件的名字相同
利用ndk-build 生成so库
Application.mk 是让这so支持各种架构的cpu的
CD到jni 目录
ndk-build 会生成so库了,生成的so库会在libs下面
6.添加部署
ndk{ //自动编译 相当于Android.mk 和 Application.mk
moduleName "calc" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。目前可有可无。
}
sourceSets {
main {
//jni库的调用会到资源文件夹下libs里面找so文件
jniLibs.srcDirs = ['libs'] //指定so库路径
}
}
添加NDK路径,这个应该放在最前面
7.加载so库
在MainActivity里面进行调用
到此一个java调用C计算的加法就完成了。
(本文只是简单的编写,没有给具体分析JNI的编写规范等,自己可以找资料)..
学会了吗?