JNI与NDK,JNINDK
分享于 点击 43847 次 点评:58
JNI与NDK,JNINDK
JNI
定义 :
Java Native Interface
,即 Java
本地接口
作用:
使得Java 与 本地其他类型语言(如C、C++)交互
注意:
JNI
是Java
调用Native
语言的一种特性JNI
是属于Java
的,与Android
无直接关系
调用实现步骤:
NDK
定义 :
Native Development Kit
,是 Android
的一个工具开发包
NDK
是属于Android
的,与Java
并无直接关系
作用:
快速开发
C、 C++
的动态库,并自动将so
和应用一起打包成APK
(即可通过NDK
在Android
中 使用JNI
与本地代码(如C、C++
)交互。)NDK
集成了交叉编译器,并提供了相应的mk文件隔离平台、CPU
、API
等差异,开发人员只需要简单修改.mk
文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so
。NDK
提供了一份稳定、功能有限的API
头文件声明。
调用实现步骤:
Android工程中C/C++代码解析
native-lib.cpp
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring JNICALL
Java_com_kevin_cpp_MainActivity_stringFromJNI(
JNIEnv *env,jobject obj ) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
JNIEXPORT
、NICALL
、JNIEnv
和jobject
都是JNI
标准中所定义的类型或者宏,它们的含义如下:JNIEXPORT
和JNICALL
:他们是JNI
中所定义的宏,可以在jni.h
这个头文件中查询到;JNIEnv*
:表示一个指向JNI环境的指针,可以通过它来访问JNI提供的接口方法。jobject
:表示Java
对象中的this
;
注意:JNI调用C或者C++存在区别:
在C
代码中:JNI
函数调用由“(*env)->”
作前缀,目的是为了取出函数指针所引用的值。
return (*env)->NewStringUTF(env,"HelloJNI!");
在C++
代码中:JNIEnv
类拥有处理函数指针查找的内联成员函数。
return env->NewStringUTF("HelloJNI!");
可以发现,C
或者C++
的实现很类似,但是它们对env
的操作方式不同,因此使用C
和C++
来实现同一个JNI
方法,它们的区别主要集中在对env
的操作上。
相关文章
- 暂无相关文章
用户点评