我想在Android中的调试和发布模式下使用不同的库

问题描述 投票:0回答:4

调试:

jniLibs/armeabi/a.so

发布:

jniLibs/armeabi/b.so

我想在调试模式下使用a.so,在发布模式下使用

b.so
,我该如何在
build.gradle
或其他模式下进行?

.so
图书馆是第三个图书馆,位于
jniLibs/armeabi/
。我不知道具体的调用时机,所以无法使用
System.loadLibrary()
方法。

谢谢!

android gradle groovy android-gradle-plugin
4个回答
4
投票

这是另一种选择。像这样添加你的调试 SO 文件:

app/src/debug/jniLibs/armeabi/<yourdebug>.so

将您的发布 SO 文件保留在主源集中,如下所示:

app/src/main/jniLibs/armeabi/<yourrelease>.so

重要的是,

<yourdebug>.so
<yourrelease>.so
具有相同的文件名才能正常工作。

干杯!


2
投票

历史上,NDK 支持 ARMv5 (

armeabi
)、32 位和 64 位
MIPS
,但在 NDK r17 中删除了对这些 ABI 的支持。

另外,请注意以下 Google 的公告:

从 2019 年 8 月 1 日开始,您在 Google Play 上发布的应用将需要支持 64 位架构。 64 位 CPU 为您的用户提供更快、更丰富的体验。添加应用程序的 64 位版本可提高性能,为未来创新让路,并为您的设备配备纯 64 位硬件。

因此,您应该停止在 Android 应用程序中使用旧版

armeabi
。并且,开始使用 64 位 ABI。 请参阅https://developer.android.com/distribute/best-practices/develop/64-bithttps://developer.android.com/ndk/guides/abis了解更多详细信息。

对于如何组织 debugrelease 构建类型,理论上,您可以将

mynative-lib.so
放在您喜欢的任何地方,例如它们位于
/Users/<your-usr-name>/android/jniLibs
之下。但是,我建议您按如下方式安排您的 debugrelease 构建类型(每个支持的 ABI):

jniLibs
├── debug
│    ├── arm64-v8a
│    │   └── mynative-lib.so
│    ├── armeabi-v7a
│    │   └── mynative-lib.so
│    ├── x86
│    │   └── mynative-lib.so
│    └── x86_64
│        └── mynative-lib.so
└── release
     ├── arm64-v8a
     │   └── mynative-lib.so
     ├── armeabi-v7a
     │   └── mynative-lib.so
     ├── x86
     │   └── mynative-lib.so
     └── x86_64
         └── mynative-lib.so

然后配置您的

app/build.gradle
文件,使其指向正确的构建类型,即

android {
    ...
    sourceSets {
        main {
            // put your jni libs that do not distinguish debug and release.
            jniLibs.srcDirs += "/Users/<your-usr-name>/android/jniLibs"]
        }
        debug {
            // put your debug version jni libs.
            jniLibs.srcDirs += "/Users/<your-usr-name>/android/jniLibs/debug"]
        }
        release {
            // put your release version jni libs.
            jniLibs.srcDirs += "/Users/<your-usr-name>/android/jniLibs/release"]
        }
    }
    ...
}

注意:将

/Users/<your-usr-name>/android/jniLibs
替换为您自己的正确路径。


1
投票

如果您使用

System.loadLibrary()
加载 SO 文件,请执行以下操作:

public final static boolean IS_DEBUG = BuildConfig.BUILD_TYPE.equalsIgnoreCase("debug");

static {
    if(IS_DEBUG) {
        System.loadLibrary("yourdebugso");
    }
    else {
        System.loadLibrary("yourreleaseso");
    }
}

0
投票

我的原始答案 - 在 Android Studio 项目中放置 JNI/本机库的位置

基于时镇答案

年份 Gradle 版本 Android Studio版本 CMake版本 NDK版本
2024 8.4 Android Studio Iguana - 2023.2.1 3.22.1 26.2.11394342

build.gradle.kts - 模块或应用程序

android {
 
    ...
 
    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
            sourceSets {
                getByName("release"){
                    jniLibs.srcDirs("src/main/nativeLibs/Release")
                }
            }

        }
        debug {
            sourceSets {
                getByName("debug"){
                    jniLibs.srcDirs("src/main/nativeLibs/Debug")
                }
            }
        }
    }

    ...

}

从Android的角度来看。仅显示“jniLibs”文件夹以及相应的 ABI。根据所选变体勾选(调试)或(发布)标记。

Android 视角 - 调试 Android 视角 - 发布 项目视角
debug release project perspective

CMakeList.txt

当构建处于活动状态时,

${CMAKE_BUILD_TYPE}
可以是调试发布
当构建处于活动状态时,
${CMAKE_ANDROID_ARCH_ABI}
可以是amr64-v8aarmeabi-v7ax86x86_64

cmake_minimum_required(VERSION 3.22.1)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
project("xdata")

set(LIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../nativeLibs/${CMAKE_BUILD_TYPE}/${CMAKE_ANDROID_ARCH_ABI})
set(MY_LIB "${LIB_PATH}/libMy.so")

include_directories(${CMAKE_SOURCE_DIR}/include)

add_library(${CMAKE_PROJECT_NAME} SHARED
        libinsane.cpp)

target_link_libraries(${CMAKE_PROJECT_NAME}
        android
        ${MY_LIB}
        log
        )
© www.soinside.com 2019 - 2024. All rights reserved.