Telegram从源代码编译后崩溃,在更改包名后出现jni错误。

3

我从官方仓库 (https://github.com/DrKLO/Telegram) 下载了 Telegram 的源代码。

我想编译此应用程序并在手机上与官方 Telegram 应用一起使用,因此我将包名称从 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 并使其运行不应该这么困难。我错过了什么吗?是否有简单的方法可以完成所有这些操作?还是这很常见?

2个回答

2

好的,这是我使其可用的方法。在干净的源代码中,没有更改任何XML,我将 applicationID 添加到了 build.gradle 中,并将 applicationIdSuffix 添加到每个构建类型(debug、release、foss)中。

现在它可以编译而不出错,并且我可以在原始应用程序之外安装它。


嗨,请问我们在哪里可以找到这个applicationId? - Pruthviraj

1
失败是因为使用本地库的Java类被重命名(从org.telegram.messenger包移动到org.telegram.myname),但相应的本地方法没有被重命名。
您可以在C++文件中重命名这些函数,这应该很容易。但实际上不需要这样做。首先您不需要重命名Java包。您的应用程序中的Java类使用的包名称与应用程序清单中使用的包名称没有要求必须一致。
AndroidManifest.xml中更改包名称可能需要为活动和服务使用全名,并修复Java中的一些import路径。但这比将所有Java类移动到新包名称下的更改要少得多。

我没有改变包,只是修改了AndroidManifest.xml和一些导入。你认为Android Studio可能会自动完成这个操作吗? - Farib Khojaste
它可以轻松地自动更改Java,但我个人从未尝试过这种方法。但是将Java类移回org.telegram.messenger也应该很容易处理。 - Alex Cohn
好的,我做了其他事情。我将其恢复到原始代码,并在“gradle.build”中仅更改了应用程序ID。现在,我可以使用不同的包名称进行编译,没有出现错误。但是,我除了原始的Telegram应用程序之外无法安装它!有任何想法为什么会这样? - Farib Khojaste
我认为在 AndroidManifest 中的 Package 名称仍然占优势。如果 AS 坚持进行链式重命名,您可以使用简单的文本编辑器来仅更改包名称。 - Alex Cohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接