一、NDK开发中难免会遇到一些错误,下面我就总结一些NDk开发过程中常见的错误。
-
写错了load的library
java.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null
检查loadLibrary中是否按照正确的规范来写的
System.loadLibrary("hello");
-
Android.mk文件编写错误
/jni/Android.mk:4: * missing separator. Stop.
检查mk文件是否写对
-
-
LOCAL_MODULE配置不能有扩展名
//jni/Android.mk:hello.so: LOCAL_MODULE_FILENAME must not contain a file extension
-
c或者c++的源文件名称配置错误
objs/hello/helo.o'. Stop.
-
如果使用了错误的cpu平台
java.lang.UnsatisfiedLinkError: Couldn't load hello: findLibrary returned null
添加多cpu平台的支持 APP_ABI := armeabi armeabi-v7a x86 -
c语言方法名称错误,导致java代码无法寻找到c代码
Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.itheima.hellojni.MainActivity.helloFromC:()Ljava/lang/String;
-
应用程序闪退
06-25 07:31:46.698: I/dalvikvm(1871): #00 pc 0008ee6d /system/lib/libdvm.so
06-25 07:31:46.698: I/dalvikvm(1871): #01 pc 000738ca /system/lib/libdvm.so
06-25 07:31:46.698: I/dalvikvm(1871): #02 pc 000739f4 /system/lib/libdvm.so
06-25 07:31:46.698: I/dalvikvm(1871): #03 pc 00038f5b /system/lib/libdvm.so
06-25 07:31:46.698: I/dalvikvm(1871): #04 pc 0003bdbd /system/lib/libdvm.so要么就是c代码有逻辑错误
要么编码问题,中文或者空格路径
二、NDK控制台log日志的输出
要想在工作台输出日志,需要以下两点:
- 在相对应的.c代码中引入相对应的头文件
#include <android/log.h>
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
-
在相对应的Android.mk中要加入相关的代码
LOCAL_LDLIBS+= -llog
意思就是引入log库, 库存放在platforms\android-*\arch-arm\usr\lib下。(-l表示引入,log为库名)
*注意*
这行代码要放在include $(BUILD_SHARED_LIBRARY)的上面,否则会报错:库文件没有引入等。如果你这样写:
就会报一下的错误:
正确的格式为:
打印结果如下:
三、如何在Eclipse中进行调试
https://jingyan.baidu.com/album/64d05a02515964de54f73b63.html?picindex=4
-
第一步:
导入android ndk自带的例子程序 NativeActivity
修改 AndroidManifest.xml 中的 Debuggable 为 true
如果出现了“Avoid hardcoding the debug mode; leaving it out allows debug and release builds to automatically assign one”错误,可以进行如下图所示的修复操作
-
第二步
启动模拟器
右键工程 NativeActivity->android tools->Add Native Support
-
编译(Ctrl + B)
- 右键工程 NativeActivity ->Debug As->Android Native Application
-
第三步
注:由于android ndk在eclipse上调试还不支持在初始化函数,所以我在触屏事件engine_handle_input中增加了断点;
使用快捷键 Ctrl+Shitf+B在 170行增加一个断点;
点击一下模拟器的屏幕;
当断点运行到的时候的效果如下图所示:
博客地址:
http://blog.csdn.net/androidstarjack/article/details/72758094
NDK探究之旅:
### 相信自己,没有做不到的,只有想不到的
如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809
微信公众号:终端研发部
(欢迎关注学习和交流)