最近看一个 NDK 项目, 因为源码使用 Eclipse IDE 写的, 想把代码导入 Android Studio 使用, 毕竟好用很多, 使用 AS 导入后, 第一个问题就是编码问题, 项目之前竟然使用的是 GBK 编码首先就是改变编码问题我先在设置中将项目编码改为 UTF-8,build 结果显示一堆错误的乱码, 在网上逛了一圈, 找到解决方案
编码
将 AS 右下角的 UTF-8 换成 GBK
跳出提示选择 "reload", 此时注释之类的乱码会显示正确
右下角再选择 UTF-8
跳出提示选择 "convert", 此时编码从 GBK 转为 UTF-8
编译运行, 就不会出现乱码错误了
别的乱码的类也是这种方法
NDK 支持
将项目导入之后, build 有提示错误:
- Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio. Please switch to a supported build system.
- Consider using CMake or ndk-build integration. For more information
我们把 gradle.properties 中
android.useDeprecatedNdk=true
去掉然后直接在 AS 右键 Linked C++ Project. 选择 cmake 或者 ndk build 的方式链接
cmake: 选择 CMakeLists.txt 文件
NDK build: 选择 Android.mk 文件
或者你也可以在你的 module 中加入
- externalNativeBuild {
- ndkBuild {
- path 'src/main/jni/Android.mk'
- }
- }
无法导入
ndk 支持后, 现在运行项目, 项目可以启动了, 可是运行直接崩溃, 崩溃日志为:
java.lang.UnsatisfiedLinkError: Couldn't load xxx from loader dalvik.system.PathClassLoader
看样子是无法加载库, 在 module 中加入:
- sourceSets {
- main {
- jniLibs.srcDirs = ['libs']
- }
- }
然后在 defaultConfig 中加入:
- ndk {
- moduleName "your ndk module name"
- abiFilters "armeabi", "armeabi-v7a", "x86"
- }
找不到方法
java.lang.UnsatisfiedLinkError: No implementation found for int xxxxx
大概意思是 so 库加载成功了, 但是 java 调用对应函数时, 找不到对应的 c++ 函数.
遇到这种情况, 不要怀疑, sdk 提供的包一定要把包名完整拷贝到项目路径要与 so 函数相对应
- text relocations
- java.lang.UnsatisfiedLinkError...xxx.so has text relocations
把 targetSdkVersion 降级到 22 就可以了
来源: https://juejin.im/entry/5ab51148f265da239867351a