业精于勤荒于嬉,写文章练习表达能力,写代码练习基本工。
问题:
在测试验证Xlog的过程中,自己创建的项目引入xlog,运行报错:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.demo.hellowcdb-1/base.apk”],nativeLibraryDirectories=[/data/app/com.demo.hellowcdb-1/lib/arm64, /data/app/com.demo.hellowcdb-1/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]] couldn’t find “libc++_shared.so”
查看下Xlog.java,是需要引入这两个库的:
public static void open(boolean isLoadLib, int level, int mode, String cacheDir, String logDir, String nameprefix, String pubkey) {
if (isLoadLib) {
System.loadLibrary("c++_shared");
System.loadLibrary("marsxlog");
}
appenderOpen(level, mode, cacheDir, logDir, nameprefix, 0, pubkey);
}
而自己的项目,jniLibs下只有libmarsxlog.so
通过androidstudio -> build -> Analyze Apk,发现libc++_shared.so没有打包进去。
解决方法1
拷贝已有的libc++_shared.so到jniLibs下,要找到arm64-v8a和armeabi-v7a两个架构的so,我没有采用这个方式),毕竟让编译器自己干还是省时省力,不容易出错。
解决方法2:
把mouble修改成c++工程,添加一个CMakeLists.txt,添加一个空的cpp进行编译即可自动打包libc++_shared.so,无需手工拷贝。
1,新建cpp目录,新增一个hello.cpp文件,什么都不写。
2,同样在cpp目录下,新增一个CMakeLists.txt文件,添加hellp.cpp进行编译。
cmake_minimum_required(VERSION 3.4.1)
add_library(
hello
Hello.cpp
)
3,build.gradle 添加 CMakeLists构建项目
externalNativeBuild {
cmake {
path file('src/main/cpp/CMakeLists.txt')
}
}
4,添加-DANDROID_STL参数
externalNativeBuild {
cmake {
abiFilters 'armeabi-v7a', 'arm64-v8a'
arguments "-DANDROID_STL=c++_shared"
}
}
5,重新build,发现intermediates的cmake目录自动生成了 libc++_shared.so,app也正常运行了。
├── intermediates
…
│ ├── cmake
│ │ ├── debug
│ │ │ └── obj
│ │ │ ├── arm64-v8a
│ │ │ │ ├── libc++_shared.so
│ │ │ │ └── libhello.so
│ │ │ └── armeabi-v7a
│ │ │ ├── libc++_shared.so
│ │ │ └── libhello.so
6,最后回顾一下我的module源码结构
├── AndroidManifest.xml
├── cpp
│ ├── CMakeLists.txt
│ ├── Hello.cpp
│ └── Hello.h
├── java
│ └── com
│ ├── demo
│ └── tencent
├── jniLibs
│ ├── arm64-v8a
│ │ └── libmarsxlog.so
│ └── armeabi-v7a
│ └── libmarsxlog.so
└── …