Java JNI本意是Java Native Interface,它是为了方便Java调用C、C++等本地代码所封装的一层接口。
NDK是Android所提供的一个工具集合,通过NDK可以在Android上更加方便的通过JNI来访问本地代码。NDK还提供了交叉编译器,开发者简单的修改mk文件就可以生成特定CPU平台的动态库。
1、JNI的开发流程
1)在JAVA中声明native方法
2)编译Java源文件得到class文件,然后通过javah命令导出JNI的头文件。
进入native方法所在的包下执行 javac 类名.java ;
进入java文件夹下(即native的包名外,下一个文件夹就是包名的起始位置)javah 包名.类名
然后就生成了头文件。
JNIEnv * : 表示一个执行JNI环境的指针,可以通过它来访问JNI提供的接口方法;
jobject :表示Java对象的this 。
JNIEXPORT和JNICALL :它们是JNI中所定义的宏,可以在jni.h这个头文件中查找。
下面的宏定义是必须的,它指定extern "C"内部的函数采用C语言的命名风格来编译。否则当JNI采用C++来实现时,由于C和C++编译过程中对函数的命名风格不同,导致JNI在链接是无法根据函数名查找到具体的函数,那么JNI调用就无法完成。
#ifdef __cplusplus
extern "C" {
#endif
3、实现JNI方法
JNI方法指Java中声明的native方法。在Android工程中新建jni文件夹,将通过javah生成的头文件复制到jni文件夹下,然后实现C文件或者C++文件。
4、编译so库并在JAVA中调用
我们来看一下Android.mk的作用,如果我们想要在Android的环境下编译生成自己想要的文件,我们可以生成二进制的可执行文件,可以生成动态库、静态库,这是对于C、C++层来说,那么对于我们得java层来说,Android.mk编译生成jar包或者Android.apk
这些Android.mk的编写都是我们基于Android.mk的基本语法来实现的,如果我们想在Android目录下来编写自己的项目,那我们就必须学会Android.mk的编写。
Android.mk的编写:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := uvccamera //表示模块的名称
LOCAL_SRC_FILES := test.c //表示需要参与编译的源文件
include $(BUILD_SHARED_LIBRARY)
Application.mk的编写:
// 市面上常见的架构平台armeabi、x86 和 mips ;all表示编译所有CPU平台的so库
APP_ABI := armeabi
Error: Your project contains C++ files but it is not using a supported native...
解决:https://blog.csdn.net/lanuage/article/details/53072303
在jni文件下用ndk-build命令生成so库 ,并在Java代码中加载 模块的名称 即可调用本地方法了。