Android JNIAndroid开发Android开发经验谈

Android JNI 技术的应用

2017-12-19  本文已影响102人  Mark_Liu

Android JNI技术的应用

JNI: JNI is the Java Native Interface. It defines a way for managed code (written in the Java programming language) to interact with native code (written in C/C++).


NDK

原生开发工具包 (NDK) 是一组可让您在 Android 应用中利用 C 和 C++ 代码的工具。 可用以从您自己的源代码构建,或者利用现有的预构建库。

目前的绝大多数需要用到JNI技术的第三方都是使用的NDK

NDK的配置文件

应用流程

[图片上传失败...(image-44a3b0-1513673939929)]

也可以自己指定位置创建文件夹,之后可以在Gradle文件中把JNI路径指向该文件夹

android {
    sourceSets.main {
        jni.srcDir "jniPath"
    }
}

C++ 里面jni方法名是由关联的Java文件的包名和类名+方法名组成的

example 1

package com.mark.test

public class TestJni {
    
    public native String getString();
}

上面代码中的getString方法在C++中的关联方法名为

//Java_包名_类名_方法名
Java_com_mark_test_TestJni_getString

那么example 1中的getString()方法对应的C++文件如下

#include <jni.h>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_mark_test_TestJni_getString(JNIEnv *env){
    char *str = "hello world";
    return env->NewStringUTF(str);
}

c++ 代码说明

  • jstring: jni.h中定义的类型,对应java中的String
  • JNIEXPORT: 在windows中对应__declspec(dllexport)标识,表示将该函数导出在外部可以调用
  • JNICALL:在windows中的值为__stdcall,用于约束函数入栈顺序和堆栈清理的规则。
  • JNIEnv:用于本地线程存储,提供了大量的JNI方法,并且是所有原生方法的第一个参数

OK,包含JNI的项目完成


CMake

CMake是一个开源的、夸平台的用于构建、测试、打包软件的工具组

 externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

OK,包含JNI的项目完成

项目GitBub地址
PS:文章只是JNI构建的最基础配置,更多的配置都在参考资料里给出文档地址,自己添加即可

如有问题 欢迎指正


参考资料

上一篇 下一篇

猜你喜欢

热点阅读