在Android Studio项目中放置JNI/本地库的位置

7

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

https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master

将其转换为apk文件。
为此,我创建了一个默认的Android项目,并添加了来自存储库的相关java文件并进行了一些修改。我还向我的项目中添加了适当的xml / image资源。
现在,我需要将JNI /本地库添加到我的项目中。https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master/native/ 然而,我不知道该把它们放在哪里。我能找到的唯一参考是:
1] 如何在android studio项目中添加JNI库? 但是,我的项目结构与截图不同。

2] 在Android Studio中创建jni文件夹的位置 过时/缺乏细节。
这是我的项目结构:

Project_Structure


只是确认您已查看:https://developer.android.com/ndk/guides/build - Morrison Chang
1个回答

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级别的build.gradle文件中任何喜欢的位置配置你的jniLibs路径。

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+ 版本,您不需要为您的 C/C++ 源代码显式配置 jniLibs 路径,因为它将由 Android Studio 自动管理。所有位于 src/main/cpp 下面的 C/C++ 源代码将自动编译和打包到您的 apk 中。


我有另一个应用程序的.so文件,我已经反编译了它,但是我没有那个.so文件的native-lib.cpp文件,也就是说我没有本地代码,我只有.so文件。当我运行项目时,会出现以下错误:java.lang.UnsatisfiedLinkError: No implementation found for int com.krunal.camarademo.Libs.nativesystem.DMDHDR.getBracketedCount() (tried Java_com_krunal_camarademo_Libs_nativesystem_DMDHDR_getBracketedCount and Java_com_krunal_camarademo_Libs_nativesystem_DMDHDR_getBracketedCount__)。请问我能否将其集成并在我的项目中运行? - karan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接