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

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

JNI环境配置

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

写一个简单的SO库

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

dbe7c12d224e

随后使用Terminal 执行生成.h的命令,将目录先定位到java目录,再执行

javah -jni com.monke.simplejnidemo.SimpleJniUtils

dbe7c12d224e

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

dbe7c12d224e

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

在main目录创建jni文件夹,并将刚刚生成的 .h 文件移入,新建一个 .c 文件,并引入 .h,

实现JNIEXPORT jint JNICALL Java_com_monke_simplejnidemo_SimpleJniUtils_doubleData方法

dbe7c12d224e

在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.mk,Application.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

dbe7c12d224e

最后在SimpleJniUtils类中添加

static{

System.loadLibrary("SimpleJni");

}

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

dbe7c12d224e

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

在项目中使用so库

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

dbe7c12d224e

build.gradle 中添加

sourceSets{

main{

jniLibs.srcDirs = ['libs']

}

}

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

dbe7c12d224e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值