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

Telegram compiled from source crashing, jni error after changing the package name

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

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

现在应用程序可以正常编译,但会因以下错误而崩溃:

E/art: No implementation found for void org.telegram.myname.NativeLoader.init(java.lang.String, boolean) (tried Java_org_telegram_myname_NativeLoader_init and Java_org_telegram_myname_NativeLoader_init__Ljava_lang_String_2Z)

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

但是,从源代码中启动 Telegram 和 运行 应该不难。我错过了什么吗?有没有一种简单的方法可以做到这一切?或者这只是正常现象?

失败是因为使用原生库的Javaclass改名了(从org.telegram.messenger包移到org.telegram.myname),但是对应的原生方法是未重命名。

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

更改 AndroidManifest.xml 中的包名称可能需要使用活动和服务的全名,并修复一些 import Java 中的路径。但它比将所有 Java class 都移动到新的包名称变化小得多。

好的,这就是我的工作方式。在不更改任何 XML 的干净源代码中,我将 applicationID 添加到 build.gradle 并将 applicationIdSuffix 添加到每种构建类型(调试、发布、foss)。

现在它编译没有错误,我可以在原来的应用程序之外安装它。