Android使用ndk/JNI导入so包,以及使用的方法-创新互联

最近领导提了个新需求,接入C++大佬写的.so库,由于没用过jni,在这方面我开始了研究 第一步,安装ndk,as右上角的SDK Location,选择sdk和ndk的目录

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

创新互联坚信:善待客户,将会成为终身客户。我们能坚持多年,是因为我们一直可值得信赖。我们从不忽悠初访客户,我们用心做好本职工作,不忘初心,方得始终。十多年网站建设经验创新互联是成都老牌网站营销服务商,为您提供成都网站设计、成都网站制作、网站设计、H5场景定制、网站制作、高端网站设计小程序开发服务,给众多知名企业提供过好品质的建站服务。第二步:关于导入

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的版本有关
目前还在查找原因,希望知道原因的小伙伴私聊或者发评论区造福大家。

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站栏目:Android使用ndk/JNI导入so包,以及使用的方法-创新互联
转载注明:http://scyanting.com/article/djgieh.html