在新的Android项目中使用.so文件时,是否需要遵循与so文件相同的包名 我使用了本机C++支持创建了一个项目。在这个项目中,我将int值从活动传递到C++代码,而本地代码返回这是否是素数。这非常好用,现在我想创建一个.so文件用于另一个项目。我在谷歌上发了很多帖子,但并没有得到关于如何与众不同的答案。所以我把.apk文件重命名为.zip并解压缩它。在那之后我得到了一个。所以归档

在新的Android项目中使用.so文件时,是否需要遵循与so文件相同的包名 我使用了本机C++支持创建了一个项目。在这个项目中,我将int值从活动传递到C++代码,而本地代码返回这是否是素数。这非常好用,现在我想创建一个.so文件用于另一个项目。我在谷歌上发了很多帖子,但并没有得到关于如何与众不同的答案。所以我把.apk文件重命名为.zip并解压缩它。在那之后我得到了一个。所以归档,android,android-ndk,Android,Android Ndk,现在我想在另一个项目中使用这个.so文件。所以我用不同的名称创建了一个新项目,但包名是相同的。我在src/main中创建了一个目录,并将其命名为jniLib,在这个lib中,我复制了我的.so文件目录。在我的MainActivity中,我将so文件加载为static{ 加载库(“本机库”); } 并调用我的本机方法私有本机字符串isPrimeNumber(int number)。这里一切都很完美。现在我可以得到没有实际C++代码的结果。p> 现在我又创建了一个新项目,并按照上面的步骤创建了第二个

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

并调用我的本机方法
私有本机字符串isPrimeNumber(int number)。这里一切都很完美。现在我可以得到没有实际C++代码的结果。p>
现在我又创建了一个新项目,并按照上面的步骤创建了第二个项目,但不同的是,现在我已经更改了应用程序的包名。当我运行应用程序时,我的应用程序崩溃了,错误如下

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文件只是为了隐藏本机代码,还是还有其他用途

提前谢谢

1) 是否需要使用相同的包名来使用.so文件 与.so文件相同的应用程序

不,您可以使用您想要的任何软件包名称

2) 如何获得不同的.so文件目录-当前为时间 因为我是从apk提取的

将所有.so文件复制到新的项目文件夹:src/main/jniLibs/armeabi

3) 使用.so文件是为了只隐藏本机代码,或者没有本机代码 还有其他用途吗


.所以文件是一个库。因此,其目的是方便在多个项目中重用已实现的特性

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

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

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

并在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头来找到它:您将看到一个名为类似
Java\u com\u app\u androidkt\u samplendk\u main activity\u isPrimeNumber的导出函数



挑剔的角落:可以构建一个JNI库来隐藏其指定的类名,但很难可靠地防止反向工程这些名称;还可以构建一个JNI库,该库将无缝连接到不同的软件包。

感谢您的回复。1) 当我使用不同的包名时,正如我在问题中所说,应用程序崩溃了。2) 我不知道如何创建不同的.so文件,所以在提取apk之后,我暂时只得到了一个.so文件,所以如何复制所有的.so文件。为了从Java调用C/C++api,您必须使用JNI包装器。您的Android.mk应该指出它应该编译到哪个库:.so或.a使用:include$(BUILD\u SHARED\u library)或include$(BUILD\u STATIC\u library)我使用的是Android 3.0.1,没有Android.mk文件。请告诉我是否需要添加此文件。因为我在某个地方读到Android.mk是以前使用的。谢谢你的回复。你知道如何从Android Studio创建.so文件吗。事实上,我在一段时间之前也在单独的堆栈溢出线程中问过这个问题。
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);
  }
  …
}