cocos2d-jsから3.0betaに新しい機能を追加する、静的メソッドのJava我々は直接Androidプラットフォーム上の反射によってJSを呼び出すことができます。それは使用することは非常に簡単です:
var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...)
ではcallStaticMethod
、プロセス、我々 、メソッド名は、Javaの静的メソッドにパラメータを渡すことによって署名されたJavaクラス名を直接呼び出すことができ、およびJavaメソッドの戻り値を取得することができます。下記のクラス名と署名方法は少し奇妙かもしれませんが、そのJavaの仕様です。
クラス名
パラメータ名は、Javaクラスのパッケージパスの完全なクラス名が含まれている必要があり、例えば、我々はorg.cocos2dx.javascript
次のパッケージを書いたTest
カテゴリ:
-
org.cocos2dx.javascriptパッケージ;
-
-
パブリッククラスのテスト{
-
-
パブリック静的ボイドハロー(文字列MSG){
-
System.out.println(MSG)。
-
}
-
-
パブリック静的int型の和(、int型のint B){
-
+ bを返します。
-
}
-
-
パブリック静的int型の和(INT A){
-
+返す2。
-
}
-
-
}
Testクラスの完全なクラス名がなければならないので、org/cocos2dx/javascript/Test
ここで注意することはスラッシュしなければならない/
私たちの習慣のJavaコード・ポイントの代わりに.
。
メソッド名
この方法は、非常に単純な名前で、名前和アプローチとして、元の名前は、ある方法ですsum
。
署名方法
少し複雑な署名の方法は、最も簡単な方法の署名があり()V
、それはメソッドのパラメータの値が返されませんでし表すものではありません。他のいくつかの例:
(I)V
INTを表すパラメータ、メソッドの戻り値なし(I)I
方法のINT、INT戻り値を表すパラメータ(IF)Z
INTとフロートを表すパラメータは、この方法は、ブール値を返します
それのいくつかの理解があり、括弧内の記号は、パラメータの型を示し、括弧表記の後者のタイプは、戻り値を表します。Javaは関数のオーバーロードを許可されているので、あなたは複数の方法が異なる値メソッドと同じパラメータが、戻ったことができ、メソッドのシグネチャは、これらのメソッドを区別できるように、使用したのと同じ名前です。
現在、Cocos2d-jsがJavaの型シグネチャをサポートし、次の4つの種類があります。
Java型 | 署名 |
---|---|
int型 | 私 |
浮く | F |
ブーリアン | とともに |
弦 | Ljava / LANG /文字列。 |
パラメータ
パラメータは、0または任意の数、数、ブール、文字列缶に直接使用JSであってもよいです。
使用例
私たちは、テストクラス上の静的メソッドを呼び出します。
-
//メソッド呼び出しハロー
-
jsb.reflection.callStaticMethod( "ORG / cocos2dx /ジャバスクリプト/テスト"、"こんにちは"、"(Ljava /ラング/文字列;)V"は、"これはJSからのメッセージです")。
-
-
//第1の和メソッドを呼び出します
-
VaRの結果= jsb.reflection.callStaticMethod("ORG / cocos2dx /ジャバスクリプト/テスト"、"和"、"(II)I"、3、7)。
-
cc.log(結果)。 // 10
-
-
//第2の和メソッドを呼び出します
-
VaRの結果= jsb.reflection.callStaticMethod("ORG / cocos2dx /ジャバスクリプト/テスト"、"和"、"(I)I"、3);
-
cc.log(結果)。 // 5
あなたのコンソールでは、それは非常に簡単です、出力を補正します。
ご注意ください
ノートへのもう一つのポイントは、それであるので、我々はJSを呼び出す場合、アンドロイドのアプリケーションでは、レンダリングとUIの更新がUIスレッドアプリで行われる自身のアンドロイドながらJSロジックココスは、GLのスレッドで実行されますJavaメソッドは、UIを更新するためには何も、UIスレッドにする必要がありません。
たとえば、次の例では、我々はJavaメソッドを呼び出します、それは、ダイアログボックスのアンドロイドの警告をポップアップ表示されます。
-
//私たちは次のように少し何かを追加するAppActivityに精通しています
-
パブリッククラスAppActivityは延びCocos2dxActivityを{
-
-
プライベート静的AppActivityアプリ= NULL;
-
-
公共のボイドのonCreate (バンドルsavedInstanceState){
-
super.onCreate(savedInstanceState)。
-
アプリは= この;
-
}
-
-
パブリック静的ボイドshowAlertDialog (最終文字列のタイトル、最終的な文字列メッセージ){
-
-
//ここではrunOnUiThreadを使用する必要があります。
-
app.runOnUiThread( 新しいRunnableを(){
-
-
公共のボイドの実行(){
-
AlertDialog alertDialog = 新しいAlertDialog.Builder(アプリ).create();
-
alertDialog.setTitle(タイトル)。
-
alertDialog.setMessage(メッセージ)。
-
alertDialog.setIcon(R.drawable.icon)。
-
alertDialog.show();
-
}
-
});
-
}
-
}
-
その後、我々はJSで呼び出します
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "showAlertDialog", "(Ljava/lang/String;Ljava/lang/String;)V", "title", "hahahahha");
だから、のネイティブAndroidの警告ダイアログを見に呼び出すことができます。
再加点料
今、私たちは、JSからJavaを呼び出すことができ、その後、有効にすることはできませんか?もちろんすることができます!プロジェクトCocos2dxJavascriptJavaBridgeに含まれ、このクラスが持つevalString
メソッドがに位置するJSコード、実行することができるframeworks\js-bindings\bindings\manual\platform\android\java\src\org\cocos2dx\lib
フォルダを。私達はちょうどアラートダイアログにボタンを追加し、その応答でJSを実行します。そして、上記の場合とは逆に、jsのコードの実行は、GLのスレッドで実行されなければなりません。
-
alertDialog.setButton( "OK"、新DialogInterface.OnClickListener(){
-
公共のボイドのonClick (DialogInterfaceダイアログ、INT){
-
// GLスレッドで実行する必要があります
-
app.runOnGLThread( 新しいRunnableを(){
-
-
公共のボイドの実行(){
-
(Cocos2dxJavascriptJavaBridge.evalString ! "cc.logを(\"のJavascriptのJavaブリッジ\ ")");
-
}
-
});
-
}
-
});
だから、[OK]ボタンをクリックした後、あなたはコンソールで正しい出力が表示されるはずです。EvalStringは、任意のjsのコードを実行することができ、そしてそれはあなたのjsのコード内のオブジェクトへのアクセス権を持っています。
します。https://blog.csdn.net/qinning199/article/details/42045833より転載