JNI和NDK编程

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代码中加载 模块的名称 即可调用本地方法了。

你可能感兴趣的:(JNI和NDK编程)