5

我慢してください、私はiPhone開発者であり、このAndroid全体が私を少し混乱させます。

cocos2d-xCCMenuItemから呼び出されるc++メソッドがいくつかあります。したがって、ドキュメントによると、パラメータを送信することはできません。

AndroidブラウザでURLを開く必要があります。これにより、新しいインテントを開始するためにJAVA関数を呼び出す必要があります。

VMを作成する必要があることは理解していますが、次のコードでエラーが発生します。

jni /../../ Classes / OptionsScene.cpp:184:エラー:「JNI_CreateJavaVM」はこのスコープで宣言されていません

私はこのスレッドを見ていました:Androidのc++からjavaメソッドを呼び出す

しかし、彼はパラメーターを使用しており、私にはそれができません。そして、私はそれらを自分で作るために彼のコードのどこにあるのかわかりません。

'FindClass'メソッドの文字列がどうあるべきかわかりません。また、呼び出す必要のあるすべてのメソッドで新しいVMインスタンスを作成するのはかなりひどいことだと思います。全体的に使用するシングルトンとして作成するにはどうすればよいですか?

これは私のメニュー項目によって呼び出される私のc++コードです:

#include <jni.h>
...
JavaVM *vm; // Global
...
void OptionsScene::website(){
JNIEnv *env;
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_2;
vm_args.nOptions = 0;
vm_args.ignoreUnrecognized = 1;

jint result = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args); // This line still errors

jclass clazz = env->FindClass("com/prndl/project/WebExecute");
jmethodID method = env->GetMethodID(clazz, "website", "(Ljava/lang/String;)V");
env->CallVoidMethod(NULL,method);

vm->DestroyJavaVM();

そして、これは私が呼び出す必要のあるJAVAメソッドです:

public class WebExecute extends Activity{
    public void website(){
        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
        startActivity(browserIntent);
    }
}

正直なところ、私はこれに苦労しています、どんな助けでもありがたいです。ありがとう。

4

2 に答える 2

1

いろいろ...

  1. 宣言JNIEnv* env;が与えられ、C++ を使用していることを考えると、それをどのように行っているかenv->FindClass(someString)はなく、として使用します。C の場合は使用しますFindClass(env, someString)が、C++ の場合は を使用しますenv->FindClass(someString)
  2. で使用する文字列FindClassは完全修飾パス名ですが、/代わりに区切り文字として使用します。. たとえば、クラスがFoopackagebar.baz.quuxにある場合、完全修飾名はbar.baz.quux.Fooであり、指定する文字列FindClassbar/baz/quux/Foo
  3. C++ プロセスごとに作成できる JVM は 1 つだけです。一度に 1 つの JVM を作成する必要があると確信しています。したがって、 をグローバル変数にする必要がありJavaVM* vmます (または、少なくとも、使用する必要のあるすべてのものにアクセスできる場所にする必要があります。呼び出したスレッドと同じ C++ スレッド内のすべてのものは、その呼び出しによって埋められる をJNI_CreateJavaVM()使用します。他のすべてのスレッドJNIEnv *JVM を使用したい場合は、AttachCurrentThreadそのスレッドを JVM にバインドし、そのスレッドの新しい JNIEnv *有効な値を入力する を呼び出す必要があります。
  4. コンパイラ/IDE 設定を再確認して、JDK_HOME/includeディレクトリ (を含むjni.h) がインクルード検索パスにあることを確認しましたか? ディレクトリについても同じですか (または、Android JDK で呼び出されるJDK_HOME/include/androidオペレーティング固有のディレクトリは何でも)?JDK_HOME/include

非常に役立つリソースは、JNI ブックです。

ただし、一部の例は C で記述されており、一部は C++ で記述されているため、読むときは注意してください。呼び出し規則の違いを理解していることを確認してください。

于 2012-07-04T02:54:15.427 に答える