System.loadLibrary() 在某些情况下不起作用
System.loadLibrary() not working in some instances
我正在制作一个 cocos2d-x 游戏,我遇到了一些奇怪的行为,我不确定它是否正常或发生了什么,但这是正在发生的事情,所以 AppActivity.java
class扩展 Cocos2dxActivity.java
class。我不必在 AppActivity.java
class 中调用 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__)
为什么当我声明一个普通的本机字符串时它可以工作,但是当我在字符串声明中使用该方法时却找不到该方法?
我能够通过在我的 AppActivity
class 中调用它来解决这个问题,但我觉得它应该可以工作而不必在我的 appActivity
中调用 loadLibrary
] class 因为它已经在 Cocos2dxActivity
和 appActivity extends Cocos2dxActivity
中被调用了?感谢你们能给我的任何帮助
static {
System.loadLibrary("MyGame");
}
您似乎试图在本机库尚未加载时调用本机函数。
那是因为您的 activity 在 onCreate()
的早期调用了 super.onCreate()
。 澄清一下: 应该这样称呼,你没弄错。
但是。Cocos2dxActivity作者在onCreate()
期间选择加载原生库。他们做出这个决定有充分的理由:它允许他们从您的包中提取 android.app.lib_name,并通过这种方式选择正确的库。
JNI 教程通常建议在 static {}
块中加载本机库。后者是一种更安全的做法(例如,它解决了您的字段初始化问题),但它也有其自身的缺点。
底线,你可以把ami字段的初始化移动到AppActivity.onCreate()
,如果你喜欢这样,或者你可以使用static
如果您愿意,可以在 AppActivity 中阻止。最终用户不会真正注意到差异。
我正在制作一个 cocos2d-x 游戏,我遇到了一些奇怪的行为,我不确定它是否正常或发生了什么,但这是正在发生的事情,所以 AppActivity.java
class扩展 Cocos2dxActivity.java
class。我不必在 AppActivity.java
class 中调用 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__)
为什么当我声明一个普通的本机字符串时它可以工作,但是当我在字符串声明中使用该方法时却找不到该方法?
我能够通过在我的 AppActivity
class 中调用它来解决这个问题,但我觉得它应该可以工作而不必在我的 appActivity
中调用 loadLibrary
] class 因为它已经在 Cocos2dxActivity
和 appActivity extends Cocos2dxActivity
中被调用了?感谢你们能给我的任何帮助
static {
System.loadLibrary("MyGame");
}
您似乎试图在本机库尚未加载时调用本机函数。
那是因为您的 activity 在 onCreate()
的早期调用了 super.onCreate()
。 澄清一下: 应该这样称呼,你没弄错。
但是。Cocos2dxActivity作者在onCreate()
期间选择加载原生库。他们做出这个决定有充分的理由:它允许他们从您的包中提取 android.app.lib_name,并通过这种方式选择正确的库。
JNI 教程通常建议在 static {}
块中加载本机库。后者是一种更安全的做法(例如,它解决了您的字段初始化问题),但它也有其自身的缺点。
底线,你可以把ami字段的初始化移动到AppActivity.onCreate()
,如果你喜欢这样,或者你可以使用static
如果您愿意,可以在 AppActivity 中阻止。最终用户不会真正注意到差异。