在新的Android项目中使用.so文件时,是否需要遵循与so文件相同的包名 我使用了本机C++支持创建了一个项目。在这个项目中,我将int值从活动传递到C++代码,而本地代码返回这是否是素数。这非常好用,现在我想创建一个.so文件用于另一个项目。我在谷歌上发了很多帖子,但并没有得到关于如何与众不同的答案。所以我把.apk文件重命名为.zip并解压缩它。在那之后我得到了一个。所以归档
现在我想在另一个项目中使用这个.so文件。所以我用不同的名称创建了一个新项目,但包名是相同的。我在src/main中创建了一个目录,并将其命名为jniLib,在这个lib中,我复制了我的.so文件目录。在我的MainActivity中,我将so文件加载为在新的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> 现在我又创建了一个新项目,并按照上面的步骤创建了第二个
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);
}
…
}