gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 18:58:22 25 4
gpt4 key购买 nike

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

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

并调用我的本地方法 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 中实现的本地方法的 Java 类必须与此 libnative- 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's corner:可以构建一个隐藏其指定类名的 JNI 库,但很难可靠地防止对这些名称进行逆向工程;也可以构建一个无缝连接到不同包的 JNI 库。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com