android studio下JNI生成so文件

    xiaoxiao2021-12-12  52

    1.下载NDK文件 我下的android-ndk-r13b-windows-x86_64.zip,解压,配置环境变量 (图片网上截取的,仅供参考)

    cmd下测试ndk是否按照成功,如果成功如下所示:

    (图片网上截取的,仅供参考)

    Android studio工具里ndk相关配置

    ndk从此处下载ndk解压过程中总是出错,所以采用的是上面的方法,直接网上下载。如果使用CMake开发NDK,此处下载CMake和LLDB

    CMake和传统JNI两种开发NDK的方法

    apply点击下载,需要一会时间


    2.开始写相关代码了………

    先看工程结构(里面包含有生成的libs和obj文件夹,自己不需要创建),创建jni文件夹

    public class MainActivity extends Activity { TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); MyJNI myJNI = new MyJNI(); tv.setText(myJNI.sayHello()); } }

    JNI类 添加native接口注意写好native接口和System.loadLibrary()

    public class MyJNI { static { System.loadLibrary("JniTest");//库名和gradle里面一致 } public static native String sayHello(); }

    local.properties文件配置如下:

    ndk.dir=D\:\\ndk\\android-ndk-r13b sdk.dir=D\:\\sdk

    gradle.properties文件里添加如下:

    Android.useDeprecatedNdk=true

    build.gradle文件里面如下

    android { compileSdkVersion 23 buildToolsVersion "25.0.0" defaultConfig { //添加 ndk { moduleName "JniTest" //库名字 //ldLibs "log", "z", "m" abiFilters "armeabi", "armeabi-v7a", "x86" } } //添加 sourceSets { main { jniLibs.srcDirs = ['libs'] } } }

    注意:此时jni文件夹下是空的

    AS –>Build–>Make Project, 在app\build\intermediates\classes\debug\com\example\t400\test文件夹下会生成相应的.class文件

    javah生成.h文件 点击”View->Tool Windows->Terminal“,打开终端

    xxxxx\app>cd build\intermediates\classes\debug

    然后执行如下javah命令生成h文件

    xxxxx\debug>javah -jni com.example.t400.test.MyJNI

    执行完之后你可以在文件夹\app\build\intermediates\classes\debug下看见生成的 .h头文件为:

    com.example.t400.test.MyJNI.h

    其内容为:

    /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_t400_test_MyJNI */ #ifndef _Included_com_example_t400_test_MyJNI #define _Included_com_example_t400_test_MyJNI #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_t400_test_MyJNI * Method: sayHello * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL java_com_example_t400_test_MyJNI_sayHello (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif

    将 .h文件剪切,粘贴到上面创建的空jni文件夹里,在jni目录下新建一个c文件,随意取名为jnitest.c ,然后编辑其代码如下:

    #include "jni.h" #include "com_example_t400_test_MyJNI.h" JNIEXPORT jstring JNICALL Java_com_example_t400_test_MyJNI_sayHello (JNIEnv *env, jobject obj){ return (*env)->NewStringUTF(env,"this is test data!"); }

    注:jnitest.c同目录下记得创建空的util.c文件,util.c文件是避免某bug忘记了,请搜索。


    3.收尾工作 创建Android.mk和Application.mk文件

    Android.mk在目录jni下,Android.mk文件如下:

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := JniTest LOCAL_SRC_FILES := jnitest.c LOCAL_SRC_FILES += util.c include $(BUILD_SHARED_LIBRARY)

    其中LOCAL_PATH是C/C++代码所在目录,也就是我们的jni目录。 LOCAL_MODULE是要编译的库的名称。编译器会自动在前面加上lib,在后面加上.so。 LOCAL_SRC_FILES是要编译的C/C++文件。

    Application.mk在最外层与local.properties同目级,Application.mk文件如下:

    APP_PROJECT_PATH := $(call my-dir) APP_MODULES := JniTest

    执行ndk-build命令生成所有cpu架构的so库

    切换到jni目录执行 jni> ndk-build

    如下:

    看此刻的工程,图如下:

    Android studio so 文件生成完毕!

    注:上面的Make Project 也可以用Javac 命令把.class生成到相应的位置,然后在javah改路径


    写在最后

    so文件生成后的使用

    在以上内容的基础上: 删除所有的 .mk 文件 删除所有的 .c 和 .h 文件 删除生成的obj文件夹和里面的所有文件 将生成的libs文件夹里的文件,拷贝到最外层的libs文件夹里,完成后删除该libs文件夹和里面的所有文件 至此一切OK!

    转载请注明原文地址: https://ju.6miu.com/read-900099.html

    最新回复(0)