Android 下 JNI 开发Day2

05_JNI开发常见错误-30

 重新创建一个工程演示CommonErrorDemo

1.缺少Android.mk文件报错:

Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk

解决方案:在jni目录下创建一个Android.mk文件

2. c文件没有include导入jni.h的头文件, 导致某些类型找不到.

"Compile thumb : atguigu31 <= Hello.c

  jni/Hello.c:4:1: error: unknown type name 'JNIEXPORT'

  jni/Hello.c:4:19: error: expected '=', ',', ';', 'asm' or '__attribute__' before

  'JNICALL'

 jni/Hello.c:4:19: error: unknown type name 'JNICALL'

3. 方法的形参没有指定名称. 加上名字就可以了.

  jni/Hello.c:6:3: error: parameter name omitted

4. 没有加载动态库.so文件.

No implementation found for native

Lcom/atguigu/commonerrordemo/MainActivity;.helloFromC ()Ljava/lang/String;

5. 加载动态链接库错误, 名字写错. 加载时一定要写: Android.mk文件中的LOCAL_MODULE对应的名字.

    Caused by: java.lang.UnsatisfiedLinkError: Couldn't load libatguigu31.so: findLibrary returned null

6. 确定加载.so库文件的名字没有错误, 还是报一下错误. 是模拟器问题. 把生成的arm下的.so文件,放到x86模拟器上运行就报此错误.

   Caused by: java.lang.UnsatisfiedLinkError: Couldn't load atguigu31: findLibrary returned null  

- 解决方法:

 1、在jni目录下创建一个Application.mk文件, 声明以下内容:

 先看查看文档:/android-ndk-r9/docs/APPLICATION-MK.html

 再看/android-ndk-r9/docs/CPU-X86.html文档: 

Generating x86 machine code is simple: just add 'x86' to your APP_ABI definition in your Application.mk file, for example:

生成的x86机器代码很简单:只需添加86你app_abi定义你的文件,例如: 

2、具体在Application.mk文件内容如下 

     APP_ABI := armeabi armeabi-v7a x86

           APP_ABI := all

       // 当前只能在x86的模拟器上运行, 因为生成的so文件是x86机器的机器码

          APP_ABI := x86