Android使用ndk/JNI导入so包,以及使用的方法-创新互联
正常来说直接去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文件
导入有两种方式,
然后创建"armeabi-v7a", “arm64-v8a”, “x86”, "x86_64"四个文件夹,把对应so包扔进去
编译一下,正常来说就导进去了,如何加载我后面会说到。
sourceSets {main { jni.srcDirs = [] //这一行加不加都可以
jniLibs.srcDirs = ['libs']//这个必须加,因为我们把.so文件放在了libs文件夹中
}
}
这个时候如果不报错,就算导入成功了
第三步:加载.so包这一步往往对于技术不太成熟或者萌新小白来说比较麻烦(比如我
首先,大佬给了我一串东西(我也不知道这个叫啥,这个类名是你俩规定好的
比如,他写的这个类名叫touch
public double Java.com.xx.lib.tcp.touch(参数1,参数2,参数3)
其中
java.com.xx.lib.Tcp.touch
是一个目录,touch是一个方法名,Tcp是一个类,在项目里创建文件夹,让这个类的目录与给你的相同。
package com.xx.lib;
public class Tcp {static {//这个路径名需要去头去尾,比如 libxxx.so就是xxx
//你前面如果加载正确,直接写.SO文件的名字去头去尾就行
System.loadLibrary("xxx");
}
public static native void touch(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接口的包,
我用的是第一种方式就能用了,第二种,自己百度下吧,应该差不多,就多个两步。
对了,我还遇到一个问题,不知道你们今后会不会遇到,
调用.so包的的内容以后,so包中的tcp连接成功率非常低。
有说是和安卓的版本有关(安卓11系统bug)
有说是和ndk的版本有关
目前还在查找原因,希望知道原因的小伙伴私聊或者发评论区造福大家。
这里是干了几年的大水比,啥都会一丢丢,写的不咋地,凑合凑合看吧。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站题目:Android使用ndk/JNI导入so包,以及使用的方法-创新互联
文章URL:http://cdiso.cn/article/djgieh.html