调试:
jniLibs/armeabi/a.so
发布:
jniLibs/armeabi/b.so
我想在调试模式下使用a.so,在发布模式下使用
b.so
,我该如何在build.gradle
或其他模式下进行?
.so
图书馆是第三个图书馆,位于jniLibs/armeabi/
。我不知道具体的调用时机,所以无法使用System.loadLibrary()
方法。
谢谢!
这是另一种选择。像这样添加你的调试 SO 文件:
app/src/debug/jniLibs/armeabi/<yourdebug>.so
将您的发布 SO 文件保留在主源集中,如下所示:
app/src/main/jniLibs/armeabi/<yourrelease>.so
重要的是,
<yourdebug>.so
和 <yourrelease>.so
具有相同的文件名才能正常工作。
干杯!
历史上,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-bit
和https://developer.android.com/ndk/guides/abis了解更多详细信息。
对于如何组织 debug 和 release 构建类型,理论上,您可以将
mynative-lib.so
放在您喜欢的任何地方,例如它们位于 /Users/<your-usr-name>/android/jniLibs
之下。但是,我建议您按如下方式安排您的 debug 和 release 构建类型(每个支持的 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
替换为您自己的正确路径。
如果您使用
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");
}
}
我的原始答案 - 在 Android Studio 项目中放置 JNI/本机库的位置
年份 | Gradle 版本 | Android Studio版本 | CMake版本 | NDK版本 |
---|---|---|---|---|
2024 | 8.4 | Android Studio Iguana - 2023.2.1 | 3.22.1 | 26.2.11394342 |
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。根据所选变体勾选(调试)或(发布)标记。
${CMAKE_BUILD_TYPE}
可以是调试或发布。${CMAKE_ANDROID_ARCH_ABI}
可以是amr64-v8a或armeabi-v7a或x86或x86_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
)