美文网首页
JNI开发(一) 简单的C代码打包成SO库以及项目如何调用SO

JNI开发(一) 简单的C代码打包成SO库以及项目如何调用SO

作者: MonkeZ | 来源:发表于2017-07-28 19:06 被阅读0次

      前段时间开发过程中用到了简单的JNI使用,当时发现很多网上文章总有这样那样的问题,最近趁时间充裕就记录下来,以供记忆和交流。

    JNI环境配置

    这里就不做多讲,百度一下,把脚跨过墙就好。

    写一个简单的SO库

    先在项目中创建一个类,里面暴露出本地代码的接口。

    随后使用Terminal 执行生成.h的命令,将目录先定位到java目录,再执行
    javah -jni com.monke.simplejnidemo.SimpleJniUtils

    随后系统会自动生成 .h 文件

    红框中就是需要实现的方法

    在main目录创建jni文件夹,并将刚刚生成的 .h 文件移入,新建一个 .c 文件,并引入 .h,
    实现JNIEXPORT jint JNICALL Java_com_monke_simplejnidemo_SimpleJniUtils_doubleData方法

    在build.gradle中添加

    android{ ...
       sourceSets{
           main{
               jni.srcDirs=[] //不使用gradle编译本地c/c++代码
               jniLibs.srcDirs = ['libs','src/main/libs']//加载so库 lib是第三方so src/main/libs是准备生成的so库位置
           }
        } 
    }
    

    在gradle.properties文件中,没有就新建一个,添加android.useDeprecatedNdk=true

    在jni目录中添加Android.mkApplication.mk文件

    Android.mk中写

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE := SimpleJni
    LOCAL_SRC_FILES =: simplejniutils.c
    include $(BUILD_SHARED_LIBRARY)
    

    LOCAL_MODULE打包出来lib的名称,引用so库的时候需要使用
    LOCAL_SRC_FILES是代码原文件,路径是jni目录开始,多文件使用 \ 分割

    Application.mk中写

    APP_ABI := all
    

    APP_ABI 是各个平台的分包,all是所有。

    最后使用Terminal将目录定位到main,执行ndk-build

    最后在SimpleJniUtils类中添加

    static{
            System.loadLibrary("SimpleJni");
        }
    

    测试一下,找个地方调用,run~

    一切顺利,随后我们可以将so库,SimpleJniUtils类文件以及SimpleJniUtils所在的包路径给需要的人。

    在项目中使用so库

    在项目中放入so库文件,同时将SimpleJniUtils放入项目中,SimpleJniUtils的路径必须与so打包时的路径一致。

    build.gradle 中添加

    sourceSets{
            main{
                jniLibs.srcDirs = ['libs']
            }
        }
    

    在gradle.properties文件中,没有就新建一个,添加android.useDeprecatedNdk=true,最后在需要的地方调用

    相关文章

      网友评论

          本文标题:JNI开发(一) 简单的C代码打包成SO库以及项目如何调用SO

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