0


Android使用ndk/JNI 导入so包,以及使用的方法

最近领导提了个新需求,接入C++大佬写的.so库,由于没用过jni,在这方面我开始了研究

第一步,安装ndk,as右上角的SDK Location,选择sdk和ndk的目录

正常来说直接去ndk官网下载就行了
或者在设置里搜索 Android SDK中的SDK Tools,找到ndk,点击右下角show Package Details,下载安装需要的版本,可以查查自己的版本和哪个ndk版本相对应。

第二步:关于导入

app moudle的build.gradle

defaultConfig{
 ndk {
            abiFilters "armeabi-v7a","arm64-v8a","x86","x86_64"}}

我的app支持以上四个架构,则需要四个.SO文件
导入有两种方式,

第一种是把在main目录下,创建jniLibs文件夹,名字一定要打对咯。

然后创建"armeabi-v7a", “arm64-v8a”, “x86”, "x86_64"四个文件夹,把对应so包扔进去
编译一下,正常来说就导进去了,如何加载我后面会说到。

第二种 也是创建好相应的文件夹,放到libs里,此时需要手动加载一下
  sourceSets {
        main {
           jni.srcDirs =[]//这一行加不加都可以
           jniLibs.srcDirs =['libs']//这个必须加,因为我们把.so文件放在了libs文件夹中}}

这个时候如果不报错,就算导入成功了

第三步:加载.so包

这一步往往对于技术不太成熟或者萌新小白来说比较麻烦(比如我

首先,大佬给了我一串东西(我也不知道这个叫啥,这个类名是你俩规定好的
比如,他写的这个类名叫touch

publicdoubleJava.com.xx.lib.tcp.touch(参数1,参数2,参数3)

其中
java.com.xx.lib.Tcp.touch
是一个目录,touch是一个方法名,Tcp是一个类,在项目里创建文件夹,让这个类的目录与给你的相同。

packagecom.xx.lib;publicclassTcp{static{//这个路径名需要去头去尾,比如 libxxx.so就是xxx//你前面如果加载正确,直接写.SO文件的名字去头去尾就行System.loadLibrary("xxx");}publicstaticnativevoidtouch(int a,int b,int c);}

java.com.xx.lib.Tcp.touch 根据给你的这个东西,来写目录
再次强调,这个Tcp类的位置,在java的com的xx的lib目录下,没有就去创建
如果给你的目录是个java.com.a.lib.Tcp.touch,那就去a文件夹创哥lib

必须一模一样,大小写也得一样
然后,分歧就来了
如果是一个完整的里面写java接口的包,

一:直接在需要使用的地方调用类就能用了

二:有些包需要用javac命令生成.class类,然后生成.h的头文件才能调用。

我用的是第一种方式就能用了,第二种,自己百度下吧,应该差不多,就多个两步。

对了,我还遇到一个问题,不知道你们今后会不会遇到,

调用.so包的的内容以后,so包中的tcp连接成功率非常低。
有说是和安卓的版本有关(安卓11系统bug)
有说是和ndk的版本有关
目前还在查找原因,希望知道原因的小伙伴私聊或者发评论区造福大家。

这里是干了几年的大水比,啥都会一丢丢,写的不咋地,凑合凑合看吧。


本文转载自: https://blog.csdn.net/qq_42662507/article/details/128676879
版权归原作者 若若酱敲代码 所有, 如有侵权,请联系我们删除。

“Android使用ndk/JNI 导入so包,以及使用的方法”的评论:

还没有评论