gpt4 book ai didi

Android Studio - App + NDK 模块库

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:13 27 4
gpt4 key购买 nike

在花费数小时寻找我的问题的解决方案并浏览各种论坛(包括这个论坛)之后,我终于决定提出我的问题,希望它没有在其他地方得到完整的回答。

我正在尝试构建一个非常复杂的架构:

  • 我有在单独的静态库 (.a) 中编译的 C 源代码
  • 我在模块库中通过 JNI 使用它们
  • 我想在应用项目中使用这个库。

我首先成功做了以下测试- 我已经设法在没有 NDK 的情况下制作了一个模块库,并使用应用程序对其进行了编译。- 我还设法在应用程序中直接使用静态库和 JNI,但是

我在以下步骤中失败了:- 模块内部的 JNI 与调用模块类的应用程序的组合不起作用。

我认为问题在于 aar 的包含,因为当 aar 位于库构建/输出目录中时,我无法在我的应用程序的构建目录中找到 exploded-aar。此外,所有以前的测试(包括使用JNI 成功了)。

我没有使用实验模型,因为它是实验性的,并且静态库存在已知的局限性。

我的项目结构是:

- App
- src
- main
- java
- activity
- bar
- src
- main
- java
- class
- jni
- include
- *.h
- libs
- abis...
- libmod1.a
- libmod2.a
Android.mk
Application.mk
bar.c
bar.h

应用程序 build.gradle 如下所示:

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.0"

defaultConfig {
applicationId "com.test.foo"
minSdkVersion 10
targetSdkVersion 23
versionCode 1
versionName "1.0"
}

buildTypes {

release {
debuggable false
jniDebuggable false
minifyEnabled false
}
unsigned {
debuggable false
jniDebuggable false
minifyEnabled false
}
debug {
debuggable true
jniDebuggable true
minifyEnabled false
}
}


productFlavors {
x86 {
ndk {
abiFilter "x86"
}
}
mips {
ndk {
abiFilter "mips"
}
}
armv7 {
ndk {
abiFilter "armeabi-v7a"
}
}
arm {
ndk {
abiFilter "armeabi"
}
}
fat
}

project.ext.versionCodes = ['armeabi':1, 'armeabi-v7a':2, 'arm64-v8a':3, 'mips':5, 'mips64':6, 'x86':8, 'x86_64':9]

android.applicationVariants.all { variant ->
variant.outputs.each { output ->
output.versionCodeOverride =
project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) * 1000000 + defaultConfig.versionCode
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar','*.aar'])
compile project( ":bar" )
}

模块 build.gradle 看起来像这样:

apply plugin: 'com.android.library'

android {
compileSdkVersion 23
buildToolsVersion "23.0.0"

defaultConfig {
minSdkVersion 10
targetSdkVersion 23
versionCode 1
versionName "1.0"

ndk {
moduleName "module"
}
}
buildTypes {

release {
debuggable false
jniDebuggable false
minifyEnabled false
}
unsigned {
debuggable false
jniDebuggable false
minifyEnabled false
}
debug {
debuggable true
jniDebuggable true
minifyEnabled false
}
}

productFlavors {
x86 {
ndk {
abiFilter "x86"
}
}
mips {
ndk {
abiFilter "mips"
}
}
armv7 {
ndk {
abiFilter "armeabi-v7a"
}
}
arm {
ndk {
abiFilter "armeabi"
}
}
fat
}
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
jni.srcDirs = []
}

task ndkBuild(type: Exec) {
commandLine android.ndkDirectory.getAbsolutePath()+'/ndk-build', '-C', file('src/main').absolutePath
}

tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}

模块 jni 目录中的 Android.mk 是: LOCAL_PATH:= $(调用我的目录)

#### Mod1
include $(CLEAR_VARS)
LOCAL_MODULE := mod1
LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libmod1.a
include $(PREBUILT_STATIC_LIBRARY)

#### Mod2
include $(CLEAR_VARS)
LOCAL_MODULE := pxnav
LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libmod2.a
LOCAL_STATIC_LIBRARIES := pxfd
include $(PREBUILT_STATIC_LIBRARY)

##### Parser
include $(CLEAR_VARS)
LOCAL_MODULE := module
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_LDLIBS += -landroid -llog
LOCAL_SRC_FILES := bar.c
LOCAL_STATIC_LIBRARIES := mod1 mod2
include $(BUILD_SHARED_LIBRARY)

最佳答案

我找到了类似任务的简单解决方法:我只是为 app 模块设置了 jniLibs.srcDir。现在我不依赖分解 aar 来获取 .so 文件。顺便说一句,当您决定切换到实验性 插件(以使用 native 调试、C++ 语法突出显示和交叉引用以及其他细节)时,请您检查 define LOCAL_SRC_FILES in ndk{} DSL .

关于Android Studio - App + NDK 模块库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32904248/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com