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

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接口的包,

一:直接在需要使用的地方调用类就能用了
二:有些包需要用javac命令生成.class类,然后生成.h的头文件才能调用。

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

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

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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值