安卓NDK开发中遇到的坑

来源:互联网 发布:kindle jivo套淘宝 编辑:程序博客网 时间:2024/06/10 15:44

这篇博客主要记录在安卓NDK开发过程中遇到的各种坑,将持续更新。


使用ndk-build的时候提示”no rule to make target”

 出现这个提示的原因是因为文件夹目录的问题。在Android.mk中我们使用了

LOCAL_PATH := $(call my-dir)

这句的意思就是为了确定源程序所在的位置,my-dir就说明要在当前目录下去找源码。但是我在操作过程中却把源码放在了一个文件夹中,如下图。

所有的源码都在USBController中,按照Android.mk的配置没办法找到源码,所以ndk-build提示:”no rule to make target”

解决方式: 在LOCAL_SRC_FILES中可以写当前文件夹的子文件夹,向下面这种方式。(利用Android.mk的合理的编写,找到源文件)

USBController

tips:在使用ndk-build的时候shell中应该cd到jni的上层目录,ndk-build会自动找到jni文件夹中的Android.mk


UnsatisfiedLinkError: couldn’t find “xxx.so”

 在编写好.so库,并尝试load的时候,抛出了此异常,如下图:

这里写图片描述

这里写图片描述

这个问题的提示有一定的误导性,我一开始一直以为是库文件的名称写错了,或者放的文件夹不对,导致没有找到这个库。在Android Studio中调试的时候,直接的反应就是程序直接崩掉。在爆栈上搜索,有个大神让先取消掉Android Studio的instant run的这个特性。

Settings->Build,Execution,Deployment->取消勾选instant run和restart activity on code changes.

经过这样的改变之后,再次运行APP,弹出了这样一个提示:

这里写图片描述

看到提示恍然大悟:NO_MATCHING_ABIS
ABI是指(application binary interface):ABI-维基百科
我们知道了:不同的手机可能会有不同的架构,而我们只编写Android.mk
只会默认产生armeabi的架构。而刚好我们选择的手机型号和这种架构不兼容,所以在load该架构的so库的时候抛出了异常。(找不到合适的库)

解决方案:为了适配多种手机,我们可以在ndk-build的时候就产生不同架构的库文件。使用Application.mk文件就可以产生多种架构。然后在Android Studio的lib中加入这些库,那么就能自动去匹配合适的架构。

这里写图片描述

下面是在AS中引入多种so库的截图
这里写图片描述


failed to register method

这里写图片描述
这个问题其实是个很简单的问题,是在动态注册的时候出的问题,一开始我以为问题出在最容易出问题的地方:方法的签名或者类名的书写上。但是后来检查发现都没出问题。连提示都让我去在RegisterNatives函数里面去找问题。
最后才发现,是因为我没有在java层去声明native方法,所以当然这个方法会注册失败!!!

解决方法:在Java层声明private native String nativeTest();


Bad JNI version returned from JNI_OnLoad

这里写图片描述

这个问题的提示已经很明确了,就是JNI_OnLoad的返回值是个0
下面是JNI_OnLoad的写法

这里写图片描述

我们看到,在正常情况下返回值是JNI_VERSION_X_X
出现这个错误的原因,是因为我在写JNI_OnLoad的时候忘记写最后一句
return JNI_VERSION_1_6了,导致这个JNI_OnLoad居然默认返回了一个0.
添上正确的返回值后,一切正常。

待续…

0 0
原创粉丝点击