我正在制作cocos2d-x游戏,但遇到一些奇怪的行为,不确定其是否正常或正在发生什么,但这是正在发生的事情,因此AppActivity.java类扩展了Cocos2dxActivity.java类。我不必在System.loadLibrary("MyGame");类中调用AppActivity.java,因为它是在Cocos2dxActivity.java中调用的。但这是如果我做这样的正常声明会发生的情况

private native String invokeNativeString();

一切正常,但随后我尝试直接在下面声明此错误,并且收到此错误
String ami = new String(invokeNativeString());

并得到错误:
05-01 09:11:27.250 10135-10135/com.izzyjmachado.spaceball E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.izzyjmachado.spaceball, PID: 10135
        java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String org.cocos2dx.cpp.AppActivity.invokeNativeString() (tried Java_org_cocos2dx_cpp_AppActivity_invokeNativeString and Java_org_cocos2dx_cpp_AppActivity_invokeNativeString__)

为什么当我声明普通的本机字符串但在字符串声明中使用该方法而找不到该方法时,它为什么起作用?

我可以通过在AppActivity类中调用它来解决此问题,但是我认为它应该不必在loadLibrary类中调用appActivity,因为它已经在Cocos2dxActivityappActivity extends Cocos2dxActivity中被调用了吗?多亏你们能给我的任何帮助
static {
    System.loadLibrary("MyGame");
}

最佳答案

这是因为您的 Activity 在super.onCreate()的早期调用了onCreate()。只是为了清楚:这就是应该如何调用,您没有弄错。

但是。 Cocos2dxActivity作者选择在onCreate()期间加载本机库。他们有充分的理由做出此决定:允许他们从您的程序包中提取 android.app.lib_name ,并以此方式选择正确的库。

JNI教程通常建议将本机库加载到static {}块中。后者是一种更安全的做法(例如,它可以解决字段初始化的问题),但它也有其自身的缺点。

最重要的是,如果您愿意,可以将和ami 字段的初始化移到AppActivity.onCreate()中,或者,如果愿意,可以在 AppActivity 中使用static块。最终用户不会真正注意到差异。

10-06 10:12