2016-06-01 47 views
0

我有一个添加到Android Studio 2.1.1的.so文件。一切正常,我可以从.so文件中调用方法。唯一的一点是它的工作,我需要从我的应用程序中非常特定的部分调用本地方法。在Android应用中使用.so文件

例如,方法名称为Java_com_test_app_MainView_myMethod,因此我必须在名为com.test.app的程序包中从名为MainView的类中调用myMethod

因此,如果我将MainView重命名为SubView,我会得到java.lang.UnsatisfiedLinkError: Native method not found: com.test.app.SubView.myMethod

这是应该这样工作,还是我错过了什么?

+1

_“这是否应该像这样工作”_。很多,是的。有些IDE可能会帮助您进行这种重命名。你也可以在你的本地代码中使用'registerNatives'进行研究。 – Michael

回答

2

这确实应该是这样工作的。 JNI方法名称必须以_格式镜像JAVA方法名称。

this文档,下面的规则必须遵守:

解析本地方法名

动态链接程序会解决基于他们的名字条目。本地方法名由下列组分级联:

  • 一个错位完全合格的类名
  • 下划线(“_”)分离器
  • 一个错位的方法名
  • 用于重载本地方法,两个下划线(“__”)后面跟着破损的参数签名
+0

因此,如果我有几个使用不同完全限定类名的.so文件,那么我将无法在我的应用程序的同一类中使用它们?使用Xamarin我没有这个问题,因为不是在'com.test.app.MainView'中调用'myMethod',而是直接使用'Java_com_test_app_MainView_myMethod'。所以在Java中不可能有这样的事情? – user276648

+0

@ user276648我们通常可以通过从一个类调用所有本地方法来避开这个问题,尽管它可能不总是可能的,特别是如果本地方法使用java对象引用。在所有其他情况下,此解决方案是可行的IMO –

+0

好吧,这意味着我无法真正重用另一个项目中的.so文件。我应该每次使用正确的完全限定的类名重新创建一个新的。 – user276648

相关问题