我正在制作一个 cocos2d-x 游戏,我遇到了一些奇怪的行为,我不确定它是否正常或正在发生什么,但这是正在发生的事情,所以 AppActivity.java
类扩展了 Cocos2dxActivity.java
类。我不必在我的 AppActivity.java
类中调用 System.loadLibrary("MyGame");
因为它是在 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__)
为什么当我声明一个普通的 native 字符串时它可以工作,但是当我在字符串声明中使用该方法时却找不到该方法?
我能够通过在我的 AppActivity
类中调用它来解决这个问题,但我觉得它应该可以工作,而不必在我的 appActivity 中调用
类,因为它已经在 loadLibrary
Cocos2dxActivity
和 appActivity extends Cocos2dxActivity
中被调用了?感谢你们能给我的任何帮助
static {
System.loadLibrary("MyGame");
}
最佳答案
那是因为您的 Activity 在其 onCreate()
的早期调用了 super.onCreate()
。 只是为了说清楚:应该这样调用它,你没弄错。
但是。 Cocos2dxActivity 作者选择在 onCreate()
期间加载原生库。他们做出这个决定有充分的理由:它允许他们从您的包中提取 android.app.lib_name,并通过这种方式选择正确的库。
JNI 教程通常建议在 static {}
block 中加载本地库。后者是一种更安全的做法(例如,它解决了您的字段初始化问题),但它也有其自身的缺点。
最重要的是,您可以将 ami 字段的初始化移动到 AppActivity.onCreate()
中,如果您喜欢这种方式,或者您可以使用 如果您愿意,可以在 AppActivity 中使用 static
block 。最终用户不会真正注意到差异。
关于java - System.loadLibrary() 在某些情况下不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55937721/