我正在尝试编译以下代码:
https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master
进入 apk 文件。
为此, 我创建了一个带有空活动的默认 Android 项目。之后,我将存储库中的相关java文件添加到我的项目中并进行了一些修改。我还在我的项目中添加了适当的 xml/图像资源。
现在,我需要将 JNI/本机库添加到我的项目中。 https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master/native/
但是,我不知道把它们放在哪里。我能找到的唯一参考是
1] 如何在android studio项目中添加JNI库?但是,我的项目结构与屏幕截图看起来不同。
和
2] 在 Android Studio 中创建 jni 文件夹的位置,这是旧的/过时的/缺乏细节。
这是我的项目结构:
支持 jni 的 Android 项目的典型结构如下:
.
├── CMakeLists.txt // Your cmake configuration files.
├── app.iml
├── build
├── build.gradle
├── libs
├── proguard-rules.pro
└── src
├── androidTest
│ └── java
├── main
│ ├── AndroidManifest.xml
│ ├── cpp // Directory to put your jni native source code.
│ │ └── native-lib.cpp
│ ├── java
│ ├── jniLibs // Directory to put your jni libs, i.e. the .so files.
│ └── res
└── test
└── java
但是,理论上您可以在
app级别
jniLibs
文件中的任何位置配置您的 build.gradle
路径。
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
}
}
}
...
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
...
sourceSets {
main {
// put your jni libs.
jniLibs.srcDirs += "${projectDir}/jniLibs"]
}
debug {
// put your debug version jni libs.
jniLibs.srcDirs += "${projectDir}/jniLibs/debug"]
}
release {
// put your release version jni libs.
jniLibs.srcDirs += "${projectDir}/jniLibs/release"]
}
}
...
}
对于 Android Studio 3.0+,您无需为
jniLibs
源代码显式配置 c/c++
路径,因为它将由 Android Studio 自动管理。 c/c++
下的所有src/main/cpp
源代码将自动编译并打包到您的apk中。
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
)