欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

JNI与NDK,JNINDK

来源: javaer 分享于  点击 43847 次 点评:58

JNI与NDK,JNINDK


JNI

定义 :

Java Native Interface,即 Java本地接口

作用

使得Java 与 本地其他类型语言(如C、C++)交互

注意:

  • JNIJava 调用 Native 语言的一种特性
  • JNI 是属于 Java 的,与 Android 无直接关系

调用实现步骤:

NDK

定义 :

Native Development Kit,是 Android的一个工具开发包

NDK是属于 Android 的,与Java并无直接关系

作用

  • 快速开发C、 C++的动态库,并自动将so和应用一起打包成 APK(即可通过 NDKAndroid中 使用 JNI与本地代码(如C、C++)交互。)

  • NDK集成了交叉编译器,并提供了相应的mk文件隔离平台、CPUAPI等差异,开发人员只需要简单修改.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());
}
  • JNIEXPORTNICALLJNIEnvjobject都是JNI标准中所定义的类型或者宏,它们的含义如下:

  • JNIEXPORTJNICALL:他们是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的操作方式不同,因此使用CC++来实现同一个JNI方法,它们的区别主要集中在对env的操作上。

相关文章

    暂无相关文章
相关栏目:

用户点评