Java 更改程序包名称android清单会导致JNI问题

Java 更改程序包名称android清单会导致JNI问题,java,android,eclipse,android-ndk,java-native-interface,Java,Android,Eclipse,Android Ndk,Java Native Interface,我一直在修改和玩弄这个项目: 源代码: 这是一个游戏男孩高级模拟器,根据GPLv2授权。在我更改android清单文件中的packagename之前,一切正常 如果不更改包名,应用程序将正常工作。但当包名称更改时,SDL将退出,并显示以下消息: (我把它改名为com.gba.emu) src文件夹中有两个包(“com.van.gba”和“org.libsdl.app”)。jni中的所有内容都指向org.libsdl.app。清单包名称为com.van.gba 当我更改com.van.gba时,它

我一直在修改和玩弄这个项目:

源代码:

这是一个游戏男孩高级模拟器,根据GPLv2授权。在我更改android清单文件中的packagename之前,一切正常

如果不更改包名,应用程序将正常工作。但当包名称更改时,SDL将退出,并显示以下消息: (我把它改名为com.gba.emu)

src文件夹中有两个包(“com.van.gba”和“org.libsdl.app”)。jni中的所有内容都指向org.libsdl.app。清单包名称为com.van.gba

当我更改com.van.gba时,它会断开

所以我想知道,是什么导致了这个问题?我在jni文件中找不到对原始包名(com.van.gba)的引用

可以通过更改包层次结构和android清单包名称来模拟此错误。(都称为com.van.gba)它将在加载gba rom时发生

(注意:在编译jni之前,将SDL2_图像添加到android.mk文件中文件夹“src”下的LOCAL_STATIC_LIBRARIES+=zlib png(如下图所示)

)中

void Java_org_libsdl_app_SDLActivity_nativeInit(JNIEnv* env, jclass cls, jobject obj)
{
...
}
它在package
org.libsdl.app
中定义了类
SDLActivity
的本机方法。如果重命名了
SDLActivity
的包,则必须重命名.c文件中的所有此类函数

另一方面,在重命名APK包时,不需要重命名Java类的包。创建一个小型的“本机包装器”Java类,并将所有本机方法移到这个类中,通常也很方便;然后在这节课上给他们打电话。这与静态本机方法尤其相关

==更新====

下面是另一个硬连线的包名称:


它正在根据包名查找一些文件;它假定其包名等于APK包名。在您的代码中可能有更多类似的地方。修复后,您将能够重命名APK包。

是的,这是正确的,但代码的结构如下。所有本机方法都指向org.libsdl.app.(SDLActivity),我没有更改它,只是更改了清单和包层次结构(com.van.gba)中的包名(com.van.gba)。我无法编辑org.libsdl.app包层次结构。这是我的问题,没有本地方法指向com.van.gba。但它仍然会因为android清单包名称的更改而中断。我无法理解android清单包名称与JNI中的文件有什么关系。(我在JNISorry中找不到对com.van.gba的任何引用,我误解了您的问题。请查看更新的答案。是的,创建目录是为了存储保存文件并加载它们。当我更改清单apk包名称时,我还重命名/重构了具有相同名称com.van.gba的层次结构包。因此我认为不应该这样做这是一个问题,因为包名在其他地方没有硬编码。谢谢你的帮助和时间。我已经搜索并试图找到一个解决方案8个小时了:P这真的很奇怪,令人沮丧。错误是由于调用SDL_Android_Init时出现了上述消息。JNI警告:收到空jclass..如果你做了一些ch如果没有反映在中,则很难找到问题。我必须承认,
“接收到空jclass”
是一个奇怪的警告。但是你可能真的在SDL类还没有准备好的时候启动了这个方法?在那里放置一个断点,然后尝试看看那里发生了什么。Android的哪个版本?JNI警告中的详细程度随着时间的推移已经得到了提高,因此可能新版本的Android会提供更有用的消息sage.我正在使用api级别12,现在将其切换到19。事实上,这是一条更具描述性的消息。我将编辑这篇文章并尝试解决它。谢谢!看起来像是
SDL\u Android\u Init()
,从
Java\u org\u libsdl\u app\u SDL\u nativeInit()调用
,正在将null
jclass
参数传递给
GetStaticMethodID
。可能是由于找不到类,然后在不检查错误的情况下传递
FindClass
的结果。
void Java_org_libsdl_app_SDLActivity_nativeInit(JNIEnv* env, jclass cls, jobject obj)
{
...
}
    String strTempPath = Environment.getExternalStorageDirectory().getAbsolutePath();
    strTempPath += "/Android/data/";
    strTempPath += SelectGameActivity.this.getPackageName();
    File dir = new File(strTempPath);