java - Android Studio中如何生成.so文件和对应的Java接口(interface)

标签 java android android-studio android-ndk

我想生成一个 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文件用到另一个项目中,为此我在网上搜索了很多,但很遗憾,我没有找到任何解决方案,解决方案他们提到的所有内容都是在项目名称 jniLibsmain 文件夹中创建一个文件夹,然后修改 Gradle 文件等等......,但没有人在工作.

这里我想知道如何添加.so文件和对应的Java接口(interface)在项目中使用?

是现在在尝试调用.so文件中的JNI函数时进入新项目的错误。

enter image description here

最佳答案

我找到了解决这个问题的方法。 不知道是不是解决问题的好办法。

当您使用“包括 C++ 支持”创建项目并编写 native (C/C++) 代码时,然后运行该应用程序,如果一切正常,那么您可以在构建文件夹中查看生成的 .so 文件在以下路径中:打开它,您将在单独的文件夹中看到所有平台的 .so 文件。

enter image description here

现在创建一个新项目并将项目 View 更改为“项目”视角:

enter image description here

然后将所有文件夹复制并粘贴到“app”的 libs 文件夹中:

enter image description here

然后在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 文件如下所示:

enter image description here

完成后,同步 Gradle 文件:

enter image description here

然后从“构建”菜单中创建项目:

enter image description here

完成该过程后,将项目 View 更改为 Android,您将在其中看到一个“jniLibs”文件夹和生成的 .jar 文件:

enter image description here

现在去创建一个新项目,什么也不做,只需将 .jar 文件复制并粘贴到 libs 文件夹中:

enter image description here

现在右键单击并选择“添加为库”:

enter image description here

然后选择“ native 库位置”并单击“确定”,然后在下一个对话框中再次单击“确定”。

enter image description here

现在,在第一个项目中编写 C/C++ 代码时,在同一个包中创建同一个类。并通过这样调用加载库:

System.loadLibrary("native-lib");

在那之后,IDE 会在 native 方法上给出一个错误,不用管你的工作。

注意: 本地方法类必须与创建时同名且在同一个包中,否则找不到方法。

希望这可以帮助那些与 JNI 有同样问题的人。

关于java - Android Studio中如何生成.so文件和对应的Java接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45582804/

相关文章:

java - Android:调整 EditText 字体大小使文本适合一行

java - 如何使 sql 从输入到 JTextField 的数据中插入字符串

Android 不会加载回纵向布局

java - 如果 JUnit 测试失败则停止测试

android同步/下载框架

android - react native Android : Generating Signed APK through Android Studio doesn't include JS Bundle

Android Studio 渲染问题

java - 使用 String.format 时如何缩进新行?

java - 将 Java SSLSocket 转换为未加密的 Socket

android - 获取按钮 ID 而不是整个按钮