关于NDK让我挠了两天头的问题

      前段时间,公司同事让我帮忙分析一个关于相机设备的功能对接能不能做,准备给领导一个答复,我看了一下说有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库工具类一样的文件夹名,把创建的工具类放到这个文件夹下,就可以正常使用了

上图

完事,今天晚上能睡好觉了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值