前段时间,公司同事让我帮忙分析一个关于相机设备的功能对接能不能做,准备给领导一个答复,我看了一下说有sdk就行,没什么问题。同事说,可能会提供的是so库,我说可以,so库引进来就行,网上都能找到引so库的方法。
故事到现在就开始了,不想看故事的就直接翻到最后边吧。
第二天上班,忙完手里边的活,想了一下同事提到的问题,如果领导要求对接相机设备,可能还是我的活,那我得提前准备一下啊,我也没自己引过so库,我自己创建一个so库然后自己调用一下,那这准备工作是不是就完成一半了,想到这,说干就干。
进入主题,我都想好了,先在网上找一下Android NDK开发,Android创建so库,一找就找到好多回答,大多数都比较相似,感觉学会了,这也太简单了,用Android studio 安装好ndk什么的,创建一个Native C++的项目,里边自动在main下创建了一个cpp的文件夹,里边就是c++的代码,然后build一下so库就出来。
上图
生成so库是不是很简单,手拿把掐,当时我就骄傲了,还有谁
我在拿着这so库引用依赖一下,这不就齐活了吗
但是现实告诉我,什么叫你高兴的太早了
我拿着编译出来的这两个架构的so库,直接放在了jniLibs下,先说明,放在这下边,确实不需要其它配置了,不要被我误导了
我刚开始是直接在新项目的MainActivity里
System.loadLibrary("createsodemo");
public native String stringFromJNI();
看起来没问题吧,一运行,
直接闪退
直接闪退
直接闪退
凑,这什么玩意,没错啊,和编译so库的项目写的一样啊,我就是复制粘贴过来的怎么报错嘞
然后一顿在网上找报错的解决信息,然后再一顿改,什么封装一下啊,包名不同啊
继续闪退
继续闪退
继续闪退
算了,毁灭吧,累了。
。。。
搞了快一天了,怎么改也不行,在编译so库的项目里就能运行,在新项目里就是不行,网上的答案翻了一个遍,没有我想要的答案
晚上睡不着觉了,凑
但是,不知道怎么了,我这个不服输的性格啊,这篇文章能出现,就证明一件事,我现在把这个问题结局了
哈哈哈哈哈哈哈哈哈哈哈哈哈或或或或或哈哈哈哈或哈哈哈哈或
让我先开心一下
我一直搞错了一个事情,那就是 C 里边的方法名,和java里边的类地址有个对应关系,怪我,学习的时候三心二意,没有认真看这两个说明的对应关系,而且还搞混了一件事情,那就是,java里边的类名方法名可以改,C 里边的方法类名也能改
下午的时候还在调这个问题,连Android JNI动态注册以及JNI签名都搞上了,还是不行,难道真的是我悟性太低了吗,
然后,突然像打开了新世界的大门一样,我发现如果我在编译so库的项目里,把C的方法名改一下,改成一个工具类的类名,不使用 MainActivity 了,
哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇
我凑,我说怎么总报找不到类,要么dex里找不到方法的错,原来是这回事
原来,想要使用so库,必须,一定,强制要创建一个类,它的包名和类名要与创建so库的C里的方法名称一 一对应,一个字母都不能查,类里的native方法名也要对应上要使用的C方法,写错了就崩给你看
所以,可以在创建so库的项目里,新建一个工具类,在这个类里边加载so库,创建native方法
重点来了,需要修改C里边方法名指向到这个类,要不然默认的方法指向的是MainActivity
然后编译新的so库,给新项目使用,新项目创建与编译so库工具类一样的文件夹名,把创建的工具类放到这个文件夹下,就可以正常使用了
上图
完事,今天晚上能睡好觉了