android - 在新的Android项目中使用.so文件时,是否需要遵循与so文件相同的包名

标签 android android-ndk

我使用 native C++ 支持创建了一个项目。在这个项目中,我将 int 值从 Activity 传递到 C++ 代码, native 代码返回无论这是否是素数。这工作得很好,现在我想创建 .so 文件以在另一个项目中使用。我在谷歌上搜索了很多帖子,但没有得到如何为所有设备获取不同的 .so 文件的答案。所以我将 .apk 文件重命名为 .zip 并解压它。之后我得到了一个 .so 文件。

现在我想在另一个项目中使用这个 .so 文件。因此我创建了具有不同名称但包名称相同的新项目。我在 src/main 中创建了一个目录,并将其命名为 jniLib,在这个库中我复制了 .so 文件目录。在我的 MainActivity 中,我将 so 文件加载为 static { System.loadLibrary(“native-lib”); }

并调用我的 native 方法private native String isPrimeNumber(int number);。这里一切都很完美。现在我无需实际的 C++ 代码即可获得结果。

现在我再次创建了新项目并按照上述步骤创建了第二个项目,但不同之处在于现在我更改了应用程序的包名称。当我运行应用程序时,我的应用程序因错误而崩溃

FATAL EXCEPTION: main
                                                                                Process: com.app.androidkt.differentpackage, PID: 16970
                                                                                java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.app.androidkt.differentpackage.MainActivity.isPrimeNumber(int) (tried Java_com_app_androidkt_differentpackage_MainActivity_isPrimeNumber and Java_com_app_androidkt_differentpackage_MainActivity_isPrimeNumber__I)
                                                                                    at com.app.androidkt.differentpackage.MainActivity.isPrimeNumber(Native Method)
                                                                                    at com.app.androidkt.differentpackage.MainActivity.access$000(MainActivity.java:10)
                                                                                    at com.app.androidkt.differentpackage.MainActivity$1.onClick(MainActivity.java:38)
                                                                                    at android.view.View.performClick(View.java:5268)
                                                                                    at android.view.View$PerformClick.run(View.java:21550)
                                                                                    at android.os.Handler.handleCallback(Handler.java:822)
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:104)
                                                                                    at android.os.Looper.loop(Looper.java:207)
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5811)
                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:681)

所以我的问题是 - 1)是否需要使用与 .so 文件相同的包名称来在我们的应用程序中使用 .so 文件。 2)我如何获得不同的.so文件目录 - 目前我已经从apk中提取了它。 3)使用.so文件只是为了隐藏 native 代码还是还有其他目的?

提前致谢。

最佳答案

您的应用程序包名称可以是任何名称,但是使用在 libnative-lib.so 中实现的 native 方法的 Java 类必须与此 libnative- 作者的 Intent 完全相同。 lib.so 文件。

最简单的设置解决方法是将您的 com.app.androidkt. Differentpackage.MainActivity 类移至 com.app.androidkt.samplendk包裹。 Android Studio 将帮助您进行此重构。请注意,现在您必须在 AndroidManifest.xml 中声明 MainActivity 的完整路径。

或者,您可以创建一个小型com.app.androidkt.samplendk.MainActivity 类:

package com.app.androidkt.oldpackage;

public class MainActivity {
  static {
    System.loadLibrary("native-lib");
  }
  public native String isPrimeNumber(int number);
}

并在您的MainActivity.java中添加几行:

package com.app.androidkt.differentpackage;

public class MainActivity extends AppCompatActivity {

  private com.app.androidkt.oldpackage.MainActivity pmSolver;
  private String isPrimeNumber(int number) {
    return pmSolver.isPrimeNumber(number);
  }
  …
}

如果您不知道此 libnative-lib.so 使用的确切包名称,您可以通过解析其 ELF header 来找到它:您将看到一个类似于 的导出函数>Java_com_app_androidkt_samplendk_MainActivity_isPrimeNumber


Nitpicker 的角落:可以构建一个 JNI 库来隐藏其指定的类名,但很难可靠地防止对这些名称进行逆向工程;还可以构建一个 JNI 库来无缝连接到不同的包。

关于android - 在新的Android项目中使用.so文件时,是否需要遵循与so文件相同的包名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49511189/

相关文章:

android - 从应用程序内运行仪器测试并等待结果

android - 当设备屏幕被锁定时,UDP/RTCP 数据包未到达设备/应用程序

Android:包括用于不同架构的 ndk .so 库,应用程序崩溃

java - Android Studio 中带有实验性 Gradle 插件的 native 预构建共享库

android - 当应用程序在 android 中处于前台时,每 5 秒更新一次状态

android - Espresso IdlingResource 轮询频率

java - 保存对话框输入

javascript - Nativescript ScrollView 不滚动

android - 错误 : Activity class {} does not exist

android - 无法在android studio上配置NDK路径