NDK探究之旅《九》——jni开发中常见的错误及其注意事项
为了更进一步地学习和研究NDK,针对于NDK开发过程中经常碰到的一些问题,进行了一次总结。无论公司项目有多忙,下班仍然要按照计划进行一点点进行。每天进步一小步,成功就是一大步。下面我会继续带着大家探究NDK。
博客地址:
一、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.so06-25 07:31:46.698: I/dalvikvm(1871): #01 pc 000738ca /system/lib/libdvm.so06-25 07:31:46.698: I/dalvikvm(1871): #02 pc 000739f4 /system/lib/libdvm.so06-25 07:31:46.698: I/dalvikvm(1871): #03 pc 00038f5b /system/lib/libdvm.so06-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中进行调试
第一步:
导入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行增加一个断点;
点击一下模拟器的屏幕;
当断点运行到的时候的效果如下图所示:
博客地址:
NDK探究之旅:
Hello,伙伴们
长按二维码就可以关注我们啦
(欢迎关注学习和交流)