Java之 NDK

NDK

Android NDK 是一套允许您使用 C 和 C++ 等语言,以原生代码实现部分应用的工具集。在开发某些类型的应用时,这有助于您重复使用以这些语言编写的代码库。

参考:
Android NDK

NDK (Native Develop Kit),从含义很容易理解就是本地开发工具箱。大家都知道,Android 开发语言是Java,不过我们也知道,Android是基于Linux的,其核心库很多都是C/C++的,比如Webkit等。

使用

实际上我们开发Android应用使用平台提供的API就足够满足大部分需求,但是为什么Google仍旧提供NDK呢?

  1. 在平台之间移植应用
  2. 重复使用您自己或其他开发者的 C 或 C++ 库。
  3. 进一步提升设备性能,以降低延迟,或运行计算密集型应用,如游戏或物理模拟。
  4. 不依赖于Dalvik Java虚拟机的设计
  5. 代码的保护。

NDK到so

jni-so.png

JNI

Java调用C/C++在Java语言里面本来就有的,并非Android自创的,即JNI。JNI就是Java调用C++的规范。当然,一般的Java程序使用的JNI标准可能和android不一样,Android的JNI更简单。

JNI (Java Native Interface),翻译过来就是Java本地接口。JNI是Java调用Native语言的一种特性。由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。

使用

因为在实际需求中,需要Java代码与C/C++代码进行交互,通过JNI可以实现Java代码与C/C++代码的交互。

三个角色

如图所示:

jni-so.png

实现一个简单的JNI调用

首先先加载本地动态库

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

编写一个JNI方法

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();

编写的c++方法

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring

JNICALL
Java_com_example_remer_jnidemo_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

其中的规则:

Java_com_example_remer_jnidemo:包名
MainActivity:类名
stringFromJNI:方法名
jstring:返回值类型

其中JNIExport和JNICALL是不固定保留的关键字不要修改

规则如下图:

java-c.png

引用

Android NDK
cmake
Java Native Interface
Android JNI(一)——NDK与JNI基础

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容