android - 如何在 JNI andriod 项目的 AAR 中使用 .so 文件?
问题描述
我正在创建一个由构建服务器在编译时下载的 AAR,它将包含一个 C++ 预编译库,其中包含 .so 文件。我已经完成了相应文件的 c++ 和 AAR。但是,我无法通过为测试库而制作的简单测试应用程序来使用它。
显然问题是我没有告诉项目如何以 JNI 可以加载的方式链接 AAR 的内容。我似乎不知道如何将这些 AAR 文件用于 .so 资源,这是一项硬性要求。就好像在它与它一起编译之后它implementation project
丢失了 /jni 文件夹(它显然在它的压缩内容中)
我确认我在 AAR 中有带有插件的 .so 文件。表明
-jni
-x86
libmyproject.so
-armeabi-v7a
libmyproject.so
除了我不关心的其他 lib/res/assets 等。
运行我的项目,我在 myproject-Android-release 和 build/aar-debug 中看到预期的文件 myproject-Android-debug.aar。这就是我想要它们的地方。
在我的 settings.gradle 我有
include ':myproject-Android-debug',':myproject-Android-release'
在我的 build.gradle 我有
import xxx
buildscript {
apply plugin: 'xxxx'
dependencies {
classpath brazil.tool('AndroidGradle', 'AndroidSDK', 'KotlinGradlePlugin', 'xxxx')
}
}
apply plugin: 'xxx'
apply plugin: 'xxx-android-sdk'
apply plugin: 'com.android.application'
apply plugin: 'xxx-android'
configurations {
ktlint
}
dependencies {
implementation brazil.build()
testImplementation xxx.testbuild()
ktlint brazil.tool('Ktlint')
implementation project(":myproject-Android-debug")
}
android {
compileSdkVersion SDK.platformVersion.toInteger()
buildToolsVersion SDK.buildToolsVersion
defaultConfig {
applicationId "com.company.testapp"
minSdkVersion 23
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk {
abiFilters "armeabi-v7a", "x86"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
// let gradle pack the shared library into apk
//possibly here?
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
abortOnError false
}
packagingOptions {
exclude "/META-INF/proguard/**"
}
}
task ktlint(type: JavaExec) {
inputs.files(project.fileTree(dir: "src", include: "**/*.kt"))
outputs.dir("${buildDir}/reports/ktlint/")
group = 'verification'
main = "com.github.xxxx"
classpath = configurations.ktlint
args = [
"--reporter=plain",
"--reporter=checkstyle,output=${buildDir}/reports/ktlint/ktlint-report.xml",
"src/**/*.kt"
]
}
check.dependsOn ktlint
task ktlintFormat(type: JavaExec) {
group = 'verification'
main = "xxx"
classpath = xxx
}
崩溃输出
2020-04-24 01:20:57.150 10387-10387/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.company.testapp, PID: 10387
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/base.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_dependencies_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_0_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_1_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_2_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_3_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_4_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_5_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_6_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_7_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_8_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/lib/x86, /system/lib]]] couldn't find "libmyproject.so"
at java.lang.Runtime.loadLibrary0(Runtime.java:1012)
at java.lang.System.loadLibrary(System.java:1669)
at com.company.project.MainActivity.<clinit>(MainActivity.kt:33)
解决方案
推荐阅读
- jsp - “预期语句或表达式结束”的例外
- r - 来自 R 中 quantmod 的 getSymbols() 不起作用
- r - 为什么 R HTTR 内容语句没有产生预期的请求正文?
- git - 远程服务器的 Git 客户端
- python - 列表索引必须是整数或切片而不是 str
- javascript - 尝试使用 html 中已有的 div 列表进行无限滚动
- javascript - 如果在 Django 中单击,如何使所有删除 href 标记与 java 脚本一起工作
- c++ - 条件断点失败的 GDB Eigen 调试
- reactjs - 有没有办法在单个变量下导入多个导出?
- browser - 尝试运行密码查询时出现未知错误