android studio中jni的so库编写流程

目录

1、准备工作

2、开始开发


1、准备工作

  1. 打开sdkManager,安装NDK和相关组件

    android studio中jni的so库编写流程

     

  2. 新建android项目
  3. 配置javah-tool

    android studio中jni的so库编写流程

    相关路径:

    //固定编译指令
    -classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$
    //固定工作空间
    $ModuleFileDir$\src\main\Java

     

  4. 配置ndk_build-tool

    android studio中jni的so库编写流程

     

  5. 配置project目录下的local.properties文件

    android studio中jni的so库编写流程

    代码块:

    android.useDeprecatedNdk=true

     

  6. 配置app模块下build.gradle文件

    android studio中jni的so库编写流程

    代码块:

        ndk{
                moduleName "URLPATH"       //生成的so文件名字,调用C程序的代码中会用到该名字
                abiFilters 'armeabi-v7a' ,'x86', 'x86_64', 'arm64-v8a'//so库兼容的相关cpu类型
            }
    sourceSets.main {
            jniLibs.srcDir 'src/main/libs'
            jni.srcDirs = [] //disable automatic ndk-build call
        }

     

2、开始开发

  1. 在app-src-main目录下建立jni目录

    android studio中jni的so库编写流程

    然后在弹出界面直接点finish,不用选中change jni location的选项

  2. 在jni目录下建立Android.mk文件
    LOCAL_PATH :=$(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE :=URLPATH
    LOCAL_SRC_FILES :=URLPATH.c
    include $(BUILD_SHARED_LIBRARY)
    
    
    ##URLPATH分别对应so库的库名和下面步骤中对应的.c文件

     

  3. 在jni目录下建立Application.mk文件
    APP_MODULES := URLPATH
    APP_ABI := armeabi-v7a,x86,x86_64,arm64-v8a
    
    ## 上面两个=后面的参数对应app-build.gradle文件中的ndk配置

     

  4. 在app-src-main-java路径下建立so原型的java类
    //类名最好和你需要的SO库名一致
    public class URLPATH {
        //声明库名
        static {
            System.loadLibrary("URLPATH");
        }
        //建立静态的native函数,也可以非静态native函数,可以不要参数
        public static native String getPath(String action);
    }

     

  5. 选中原型java类,通过自己建立的javah工具进行编译我们建立的原型类,编译成功后会在jni目录中生成相应的.h文件

    android studio中jni的so库编写流程

    android studio中jni的so库编写流程
    编译结果
    ​​​
  6. 在jni目录下编写对应的.c或者.cpp文件
    //
    // Created by Administrator on 2019/2/20.
    //
    //引用上一步生成的.h头文件
    #include "com_linzi_ndkapplication_JNITest_URLPATH.h"
    
    /**
     * 上边的引用一定要和.h的文件名加后缀,
     * 下面的方法名一定要和.h文件中的方法名称一样
     */
    const char *str="我是so库内容:";
    //定义c语言的相关执行方法,方法名要和引用的头文件中的方法名一致,函数的参数前两个参数固定,如果你的java原型类中的函数带有参数,则这该函数的第三个及以后的参数就要转为相对应的jni类型的参数(String--jstring,int--jint等等)
    JNIEXPORT jstring JNICALL Java_com_linzi_ndkapplication_JNITest_URLPATH_getPath
                (JNIEnv *env, jobject obj,jstring action) {
    
            return (*env)->NewStringUTF(env, str);
    }
    
    

     

  7. 选中jni目录使用我们自己建立的ndk-build工具进行编译生成so文件,这个生成的so库会自动放在项目的lib目录下

    android studio中jni的so库编写流程

    android studio中jni的so库编写流程
    编译结果

     

  8. 在java中调用

    android studio中jni的so库编写流程

     

 自此便是一个完整so库开发的过程,C语言好的小伙伴可以实现更多丰富的功能。