美文网首页
何止学习JNI(一)

何止学习JNI(一)

作者: 何止搬砖工 | 来源:发表于2020-07-02 13:20 被阅读0次

    一.什么是JNI?

    JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。

    二.JNI优缺点:

    优点:

    通过JNI接口,java可以调用C/C++的方法。而C/C++相比java而言,运行的效率得到了大大的提高。

    缺点:

    一旦使用JNI,JAVA程序就丧失了JAVA平台的两个优点:

    1、程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。

    2、程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。一个通用规则是,应该让本地方法集中在少数几个当中。这样就降低了JAVA和C之间的耦合性

    三.举个栗子

    像游戏,视频播放器,图像识别开发都需要用到JNI,纯java是很难做到的。

    四.实战

    1.环境:

    Android Studio 3.5.2

    Build #AI-191.8026.42.35.5977832, built on October 31, 2019

    JRE: 1.8.0_202-release-1483-b03 amd64

    JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

    Windows 10 10.0

    2. 配置NDK

    创建Android工程(我创建的工程的包名为:com.example.so_lib)

    local.properties文件中配置:

    app build.gradle 文件配置

    '''

    android {

    …………

            ndk {//设置支持的SO库架构

                abiFilters"armeabi","armeabi-v7a","x86","arm64-v8a","arm64-v8a","x86_64"

                moduleName"HezhiJniTest"

                ldLibs"EGL","GLESv3","dl","log"

            }

    sourceSets.main {

    jni.srcDirs = []//disable automatic ndk-build call

                jniLibs.srcDir"src/main/libs"

            }

    …………

    }

    '''

    3.创建JNI调用类

    4.生成C/C++头文件

    编译JNI调用类(用小锤锤锤一下)

    到app\build\intermediates\javac\debug\classes 目录下,执行javah -jni com.example.so_lib.HezhiJniTest命令  (javah -jni 包名.HezhiJniTest)

     生成了一个.h文件

    5.生成so库

    创建一个jni目录,将生成的com_example_so_lib_HezhiJniTest.h文件拷贝到jni目录下

    在jni目录下,创建com_example_so_lib_HezhiJniTest.h对应的.c文件 ,并实现声明的方法

    (我创建的文件为JNI_test.c)

    #include "com_example_so_lib_HezhiJniTest.h"

    JNIEXPORT jstring JNICALL Java_com_example_so_1lib_HezhiJniTest_getText

    (JNIEnv *env, jobject obj){

    return (*env)->NewStringUTF(env,"何止JNI学习");

        }

    在jni目录下,创建Application.mk文件

    # ndk库函数版本号,与SDK版本号一致

    APP_PLATFORM :=android-29

    # so运行的cpu类型

    APP_ABI :=all

    APP_STL:=c++_static

    在jni目录下,创建Android.mk文件

    LOCAL_PATH :=$(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE :=JniTest

    LOCAL_SRC_FILES :=JNI_test.c

    include $(BUILD_SHARED_LIBRARY)

    在命令行进入jni目录 运行ndk-build 生成各种架构的so库

    6.so库的使用

    将生成的so库拷贝到jniLibs目录下

    调用so库里面的方法

    7.验证

    将打包好的apk部署到模拟器上验证,大功告成。

    相关文章

      网友评论

          本文标题:何止学习JNI(一)

          本文链接:https://www.haomeiwen.com/subject/ztokqktx.html