JNI/原生库在Android Studio项目中放置在哪里

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

我正在尝试编译以下代码:

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 文件夹的位置,这是旧的/过时的/缺乏细节。

这是我的项目结构:

android gradle android-ndk java-native-interface
2个回答
7
投票

支持 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中。


0
投票

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.