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