从源崩溃编译的电报,更改包名后的jni错误

时间:2015-11-06 19:32:38

标签: android android-studio android-ndk java-native-interface telegram

我从官方存储库下载了Telegram的源代码: https://github.com/DrKLO/Telegram

我想编译应用程序并使用它除了手机中的官方电报,所以我将包名称从org.telegram.messenger更改为org.telegram.myname然后我不得不更改java代码中的一些引用所以我做到了。

现在应用程序编译正常,但它崩溃了这个错误:

  

E / art:找不到void org.telegram.myname.NativeLoader.init(java.lang.String,boolean)的实现(尝试过Java_org_telegram_myname_NativeLoader_init和Java_org_telegram_myname_NativeLoader_init__Ljava_lang_String_2Z)

我知道这是因为jni使用包名来引用c ++代码中的java方法,我可以通过更改本机代码并将其编译为.so文件来修复它。

但是,从源代码开始运行Telegram并不困难。我错过了什么吗?做这一切有简单的方法吗?或者这是正常的吗?

2 个答案:

答案 0 :(得分:2)

好的,这就是我的工作方式。在没有更改任何XML的干净源代码中,我向applicationIDbuild.gradle添加了applicationIdSuffix到每种构建类型(debug,release,foss)。

现在它编译没有错误,我可以安装它除了原始的应用程序。

答案 1 :(得分:1)

失败是因为重命名了使用本机库的Java类(从org.telegram.messenger包移动到org.telegram.myname),但未重命名相应的本机方法。

您可以在C ++文件中重命名这些功能,这应该很容易。但没有必要这样做。您首先不需要重命名Java包。您的应用程序的Java类不需要使用应用程序清单中使用的包名称。

更改 AndroidManifest.xml 中的软件包名称可能需要使用活动和服务的全名,并在Java中修复一些导入路径。但是,将所有Java类移动到新包名称的变化要小得多。