JNI初步(四) jnindk -build方式完整版(简单)

    科技2022-08-17  111

    建议先看一看jni的手动配置方法

    https://blog.csdn.net/we1less/article/details/108691477

    配置环节

    1.进入Project Structure界面   配置NDK   没有下载一个

    2.在项目的local.properties文件中同样配置一下(其实这块是自动生成的)

    3.在gradle.properties文件中加上一行:

    android.useDeprecatedNdk=true

    4.在External Tools下配置两个插件。Settings  -->  Tools  -->  ExternalTools   点击+号增加。

                Program:    这里配置的是JDK目录下的javah.exe的路径。注意没有环境变量就直接找到对应jdk的路径下的 javah.exe

    $JDKPath$\bin\javah.exe 

                Parametes:     $FileClass$指的是要执行操作的类名(即我们操作的文件)

                                         $ModuleFileDir$/src/main/jni表示生成的文件保存在这个module目录的src/main/jni目录下。

    -classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$

                Working:         module目录下的src\main\java目录。

    $ModuleFileDir$\src\main\java

    使用方式:选中java文件-->右键-->External Tools-->javah-jni,将生成jni文件夹以及文件夹下的 包名.类名的.h头文件

    5.ndk -build命令,是根据C/C++文件生成so文件的。

                Program:         这里配置的是ndk下的ndk-build.cmd的路径。

    E:\androidSDK\ndk\21.3.6528147\ndk-build.cmd 

                Working:          

    $ModuleFileDir$\src\main\

    使用方式:选中C/C++文件-->右键-->ExternalTools-->ndk-build,将在main文件夹下生成libs文件夹以及多个so文件,我们可以移动至jniLibs目录下去。


    6.在jni目录下增加两个文件        Android.mk

    LOCAL_PATH := $(call my-dir) // 设置当前的编译目录(Android.mk所在的目录) include $(CLEAR_VARS) // 清除LOCAL_XX变量(LOCAL_PATH除外) LOCAL_MODULE := JNI_ANDROID_AUDIO// 指定当前编译模块的名称 LOCAL_SRC_FILES := NativePlayer.cpp // 编译模块需要的源文件 include $(BUILD_SHARED_LIBRARY) // 指定编译出的库类型,BUILD_SHARED_LIBRARY:动态库;BUILD_STATIC_LIBRARY:静态库, BUILD_EXECUTEABLE指:可执行文件

    如果要生成多个模块

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := JNI_STATIC_ANDROID_AUDIO1 LOCAL_SRC_FILES := NativePlayer.cpp include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := JNI_DYNAMIC_ANDROID_AUDIO2 LOCAL_SRC_FILES := NativePlayer2.cpp include $(BUILD_SHARED_LIBRARY)

    7.在jni目录下增加两个文件        Application.mk

    APP_ABI    有四种类型(默认armeabi),armeabi、armeabi-v7a、x86、mips,设置时以空格隔开,all表示所有。

    APP_MODULES    文件中的可选配置    的类似于上面Android.mk文件中的LOCAL_MODULE,以空格隔开,且会覆盖掉Android.mk文件中的LOCAL_MODULE设置(比如Android.mk文件中的写了两个jni库的配置,LOCAL_MODULE := JNI1、LOCAL_MODULE := JNI2,而Application.mk中设置的APP_MODULES := JNI1,则只能生成JNI1的so文件,要生成JNI2的so文件的时候会报错,除非写成APP_MODULES := JNI1 JNI2,这里我们直接省略默认使用Android.mk中的)。

    APP_ABI := all

    这时候我们可以在main目录下新建jniLibs文件夹,把生成的libs文件夹内的东西均复制过去,删除新生成的jni、libs、obj三个文件夹。


    最后附上几个c++env的调用方法形式

    jstring str = env->NewStringUTF("Im godv !");

     

    Processed: 0.019, SQL: 10