JNI简述
JNI 全称 Java Native Interface , 它提供了若干的API 实现了Java和其他语言的通信(主要是C/C++])
废话不多说直接上图
本文做一个简单的计算
1.新建一个普通的Android项目
2.新建jni类
1487385997(1).jpg
和普通的类没有什么区别,定以native方法。
3.生成h.头文件(这个头文件主要是规范.c文件的编写)
首先build代码,生成Testjni.class
Android Studio 生成的.class 看图
Paste_Image.png
利用javah 生成.h的头文件
1487386794(1).jpg
利用A S的命令控制器 cd到Debug文件夹
然后根据javah生成头文件
(一定要cd到 有com文件夹 然后在javah 要不会类找不到,EC 要早src下面执行javah)
4.利用头文件编写JNI
1487387196(1).jpg
我们需要的只有画红线的部分
然后编写.c文件
拷贝画红线的部分
然后新建文件夹jni(建议将生成的头文件拷贝到jni目录,方便管理)
创建.c文件
1487387583(1).jpg
直接将头文件里面的方法拷贝过来 ,注意(生成的头文件只有参数类型,并没有参数名,前两个都是固定的写法)
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库
Paste_Image.png
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库路径
}
}
1487388836(1).jpg
Paste_Image.png
添加NDK路径,这个应该放在最前面
7.加载so库
1487389071(1).jpg
Paste_Image.png
在MainActivity里面进行调用
到此一个java调用C计算的加法就完成了。
(本文只是简单的编写,没有给具体分析JNI的编写规范等,自己可以找资料)..
学会了吗?