如何使用NDK为ARM目标构建基于Android Gradle的应用程序?
我有一个来自供应商的.so文件,它只支持“arm”。目前,它在我的Android应用程序中运行良好。不知何故,我想使用androidstudio模块分离实现,以便在本教程之后将模块导出为Jar 导出JAR时,构建过程返回一个错误如何使用NDK为ARM目标构建基于Android Gradle的应用程序?,android,android-ndk,android-gradle-plugin,gradle-experimental,Android,Android Ndk,Android Gradle Plugin,Gradle Experimental,我有一个来自供应商的.so文件,它只支持“arm”。目前,它在我的Android应用程序中运行良好。不知何故,我想使用androidstudio模块分离实现,以便在本教程之后将模块导出为Jar 导出JAR时,构建过程返回一个错误 /Users/zoom/android-ndk-r9d/toolchains/mipsel-linux-android-4.8/prebuilt/darwin-x86_64/bin/../lib/gcc/mipsel-linux-android/4.8/../../..
/Users/zoom/android-ndk-r9d/toolchains/mipsel-linux-android-4.8/prebuilt/darwin-x86_64/bin/../lib/gcc/mipsel-linux-android/4.8/../../../../mipsel-linux-android/bin/ld: skipping incompatible src/main/jniLibs/armeabi/libremote_client.so when searching for -lremote_client
/Users/zoom/android-ndk-r9d/toolchains/mipsel-linux-android-4.8/prebuilt/darwin-x86_64/bin/../lib/gcc/mipsel-linux-android/4.8/../../../../mipsel-linux-android/bin/ld: cannot find -lremote_client
collect2: error: ld returned 1 exit status
:app:linkMipsDebugRemoteDesktopSharedLibrary FAILED
FAILURE: Build failed with an exception.
日志说gradle试图根据mips构建,但由于库不兼容而失败,因为我只有arm库。
我的问题是如何跳过针对mips的构建过程?或者是否有可能只针对ARM架构
build.gradle
apply plugin: 'com.android.model.library'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "22.0.1"
defaultConfig.with {
//applicationId = "com.test.remote"
minSdkVersion.apiLevel = 19
targetSdkVersion.apiLevel = 21
//versionCode = 1
//versionName = "1.0"
}
}
android.ndk {
moduleName = "remote_client"
//CFlags += "-DANDROID_NDK"
CFlags += ['-std=c99', '-fstrict-aliasing']
ldLibs += ["log", "remoted_client"]
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles += file('proguard-rules.pro')
}
}
android.sources {
main {
jni {
source {
srcDir 'src/main/jni'
}
}
jniLibs {
source {
srcDir 'src/main/jniLibs'
}
}
}
}
android.productFlavors {
create("arm") {
ndk.with {
abiFilters += "armeabi"
ldFlags += "-Lsrc/main/jniLibs/armeabi"
}
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
}
task clearJar(type: Delete) {
delete 'mylib.jar'
}
task makeJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
rename ('classes.jar', 'mylib.jar')
}
makeJar.dependsOn(clearJar, build)
只需将
abiFilters
移动到android.ndk部分:
model {
android.ndk {
moduleName = "remote_client"
CFlags += ['-std=c99', '-fstrict-aliasing']
ldLibs += ["log", "remoted_client"]
abiFilters = ['armeabi']
}
}
最后我成功了。
下面是一个禁用特定任务的示例。
在build.gradle中添加这一行
tasks.getByPath(":app:linkMipsDebugRemoteDesktopSharedLibrary").enabled = false
在Android SDK 26、NDK 15.2上测试 在文件
app/build.gradle
上:
android {
defaultConfig {
ndk {
abiFilters 'arm64-v8a'
将仅为arm64-v8a
或所有当前未弃用的ARM目标生成:
abiFilters 'arm64-v8a', 'armeabi-v7a'
ABI列表当前位于:
在Ubuntu 17.10主机、Android Studio 3、Android SDK 26、NDK 15.2和Android 6.0.1设备上测试
示例项目。根据需要,您只需在jnilibs/mips/libremote_client.so和jnilibs/x86/libremote_client.so创建空文件,就可以愚弄工具,使其认为非arm架构存在lib版本。请确保在非arm设备上永远不要执行loadLibrary。它会给我错误“错误:无法将类为“java.lang.String”的对象“armeabi”转换为类“java.util.Set”。它应该是:
abiFilters+=[“armeabi”]
像这样设置abiFilters可以修复错误生成,但不能修复我的问题。我仍然收到相同的错误。很抱歉出错。为什么您需要“remote_client”作为您构建的本机库和它寻找的库?请尝试ldLibs=[“log”]
我有一个远程_客户端的cpp,所以我必须包含它。对不起,我现在感到困惑。您为依赖于libremoted\u client.a的ARM构建libremote\u client.so
,而链接器找不到libremote\u client.so
用于MIPS?也许你的app/build.gradle脚本有问题?