我想生成一个 SO 文件及其对应的 Java 接口(interface),以便在另一个项目中使用它。
到目前为止我做了什么:
我在 Android Studio 2.3.3(2017-08-09 的最新版本)中创建了一个带有“包括 C++ 支持”的项目,并编写了一些 C/C++ 代码并编译它,当我运行该程序时它成功了调用并返回一个“Hello from JNI”字符串。
所以在那之后,我查看了生成的 .so
文件的输出,但在那里我没有找到这个文件。之后,我在输出文件夹中找到了生成的 APK 文件,当我提取它时,我在里面发现这些文件夹都包含 .so
文件:
- arm64-v8a
- 武器
- armeabi-v7a
- mips
- mips64
- x86
- x86_64
现在的问题是,如何将这些.so
文件用到另一个项目中,为此我在网上搜索了很多,但很遗憾,我没有找到任何解决方案,解决方案他们提到的所有内容都是在项目名称 jniLibs
的 main
文件夹中创建一个文件夹,然后修改 Gradle 文件等等......,但没有人在工作.
这里我想知道如何添加.so文件和对应的Java接口(interface)在项目中使用?
是现在在尝试调用.so文件中的JNI函数时进入新项目的错误。
最佳答案
我找到了解决这个问题的方法。 不知道是不是解决问题的好办法。
当您使用“包括 C++ 支持”创建项目并编写 native (C/C++) 代码时,然后运行该应用程序,如果一切正常,那么您可以在构建文件夹中查看生成的 .so 文件在以下路径中:打开它,您将在单独的文件夹中看到所有平台的 .so 文件。
现在创建一个新项目并将项目 View 更改为“项目”视角:
然后将所有文件夹复制并粘贴到“app”的 libs 文件夹中:
然后在Gradle文件中添加如下代码:
task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {
destinationDir file("$projectDir/libs")
baseName "Native_Libs"
extension "jar"
from fileTree(dir: "libs", include: "**/*.so")
into "lib"
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
添加代码后,Gradle 文件如下所示:
完成后,同步 Gradle 文件:
然后从“构建”菜单中创建项目:
完成该过程后,将项目 View 更改为 Android,您将在其中看到一个“jniLibs”文件夹和生成的 .jar 文件:
现在去创建一个新项目,什么也不做,只需将 .jar 文件复制并粘贴到 libs 文件夹中:
现在右键单击并选择“添加为库”:
然后选择“ native 库位置”并单击“确定”,然后在下一个对话框中再次单击“确定”。
现在,在第一个项目中编写 C/C++ 代码时,在同一个包中创建同一个类。并通过这样调用加载库:
System.loadLibrary("native-lib");
在那之后,IDE 会在 native 方法上给出一个错误,不用管你的工作。
注意: 本地方法类必须与创建时同名且在同一个包中,否则找不到方法。
希望这可以帮助那些与 JNI 有同样问题的人。
关于java - Android Studio中如何生成.so文件和对应的Java接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45582804/