私は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
そのが既に呼び出されているので、クラスCocos2dxActivity
とappActivity extends Cocos2dxActivity
?あなたたちは私を与えることができます任意の助けのおかげで
static {
System.loadLibrary("MyGame");
}
それのあなたの活動を呼び出すのでsuper.onCreate()
、早期にその中にonCreate()
。ちょうどそれを明確にする:これは、それが呼ばれるべきであるか、あなたはミスなく。
だが。Cocos2dxActivityの著者は、中にネイティブライブラリをロードすることを選びましたonCreate()
。彼らは、この決定を行うための十分な理由を持っていた:それは彼らが抽出するために許可され android.app.lib_nameをあなたのパッケージから、正しいライブラリを選択するには、この方法。
JNIチュートリアルは、通常のネイティブライブラリをロードすることをお勧めしますstatic {}
ブロック。後者は、より安全な練習(例えば、それは、フィールドの初期化とあなたの問題を解決する)であるが、それはあまりにも、独自の欠点を有しています。
一番下の行は、あなたがの初期化を移動することができAMIのにフィールドをAppActivity.onCreate()
使用するこの方法のような場合、またはあなたが使用することができstatic
、あなたのブロックをAppActivityご希望の場合は、。エンドユーザーが本当に違いに気付くことはありません。