[jni] 04_NDK常见错误

Android 4.0

NDK常见错误

1、Android.mk文件不存在将Android.mk重命名为Android.mk.m,然后cygwin中:
$ ndk-build 出错
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: /cygdrive/f/02_Android/android4_0_project/Ndkhelloworld/jni/Android.mk
/cygdrive/c/android-ndk-r9b/build/core/add-application.mk:171: *** Android NDK: Aborting...    。 停止。

2、Android.mk文件 的配置信息有错误
把LOCAL_MODULE:=libHello这行给删除
$ ndk-build 出错

/cygdrive/c/android-ndk-r9b/build/core/build-shared-library.mk:23: *** Android N          DK: Missing LOCAL_MODULE before including BUILD_SHARED_LIBRARY in /cygdrive/f/02          _Android/android4_0_project/Ndkhelloworld/jni/Android.mk    。 停止。


3、c代码 语法出现错误,编译不通过
$ ndk-build 出错
解决:C语言错误往往是一个错误,报出多个错误,这时,只要修正第一个错误。
[armeabi] Compile thumb  : Hello <= Hello.c
F:/02_Android/android4_0_project/Ndkhelloworld/jni/Hello.c: In function 'Java_cn_zengfansheng_ndkhelloworld_DemoActivity_helloFromJNI':
F:/02_Android/android4_0_project/Ndkhelloworld/jni/Hello.c:7:2: error: unknown type name 'haha'
/cygdrive/c/android-ndk-r9b/build/core/build-binary.mk:384: recipe for target `/cygdrive/f/02_Android/android4_0_project/Ndkhelloworld/obj/local/armeabi/objs/Hello/Hello.o' failed
make: *** [/cygdrive/f/02_Android/android4_0_project/Ndkhelloworld/obj/local/armeabi/objs/Hello/Hello.o] Error 1


4、java层C语言代码库没有找到,静态加载代码库的时候 代码库没有找到.
将加载类库的static代码给写错了
static {
    // libHello.so。注意,和LOCAL_MODULE :=Hello一致。不要写lib前缀和.so后缀
    System.loadLibrary("Hell0");//实际为Hello,不是0
}
cygwin中$ ndk-build不会出错
11-28 02:05:49.531: E/AndroidRuntime(805): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load Hell0: findLibrary returned null
但部署到手机上出错


5、C语言代码函数签名出现错误
实际的java代码的native声明: public native String helloFromJNI();  
而将C语言中的方法签名写错了:
jstring Java_cn_zengfansheng_ndkhelloworld_DemoActivity_helloFromJNI111111(
        JNIEnv * env, jobject obj) {
    return (*(*env)).NewStringUTF(env, "hello from c javah");
}
$ ndk-build 不会出错,
部署到手机上,不运行也不错误,
但执行后就出错
11-28 02:05:49.531: E/AndroidRuntime(805): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load Hell0: findLibrary returned null(链接出错)
11-28 02:12:15.222: E/AndroidRuntime(933): Caused by: java.lang.UnsatisfiedLinkError: Native method not found: cn.zengfansheng.ndkhelloworld.DemoActivity.helloFromJNI:()Ljava/lang/String;

解决:去C代码中找,是Java没写,包名,类名,方法名,等有没有写对,是下划线连接,不是点
Java_cn_zengfansheng_ndkhelloworld_DemoActivity_helloFromJNI(
        JNIEnv * env, jobject obj) {}
6、逻辑性的错误, 使用了已经回收的内存空间, 访问了不可以被访问的内存空间,修改了不能被修改的内存空间 
解决:
断点. ndk-gdb  使用C:\android-ndk-r9b\ndk-gdb,但不够成熟
通过log 方式来观察程序执行流程