0

したがって、JavaからCを呼び出す場合に、Cヘッダーを生成する通常の手順は理解できますが、提供する「jobject」がない場合に使用する関数呼び出しがわかりません。ここのように、私は電話しようとしていますdoSomething()

public class Test {

   public void doSomething(ByteBuffer buf) { 
         System.out.println("Hi"); 
   };
}

これを読みましたが、わかりません: http ://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp16656

jobject buf = env->NewDirectByteBuffer(b, len);

jclass testClass;
jmethodID doSomethingMethod;

testClass = env->FindClass("test/Test");
doSomethingMethod = env->GetMethodID(testClass, "doSomething", "(Ljava/nio/ByteBuffer;)V");
env->CallVoidMethod(buf, doSomethingMethod);

「CallVoidMethod()」の最初のパラメータは何でしょうか?それは常に仕事の対象ですが、何ですか?これを実行すると、Eclipseで「UnsupportedOperationException」と表示されるだけで、何も出力されません。

4

1 に答える 1

1

の最初のパラメータは、問題のクラスのインスタンスを参照しているCallVoidMethodと想定されています。jobject実際にはバイトバッファを渡していますが、これはまったく別のことです。

クラスとクラス内のメソッドを検索しますが、そのクラスの実際のオブジェクトをどこにも作成(または取得)していません。それはあなたの欠けているステップです。

Javaメソッドへのバイトバッファパラメータは、オブジェクトおよびメソッドパラメータの後に渡す必要があります。何かのようなもの:

env->CallVoidMethod(testObj, doSomethingMethod, buf);

testObjそして、あなたは何か意味のあるものに設定する方法を見つける必要があります。


実際にオブジェクトをインスタンス化する必要がない場合は、Javaコードを変更doSomething()してstaticメソッドに変換する必要があります。

public class Test {
   public static void doSomething(ByteBuffer buf) { 
         System.out.println("Hi"); 
   };
}

次に、C ++コードを更新して、GetStaticMethodIDの代わりにGetMethodID、およびのCallStaticVoidMethod代わりに使用しますCallVoidMethodjobject次に、その最初のパラメーターを完全に省略できます。

env->CallStaticVoidMethod(doSomethingMethod, buf);
于 2013-02-22T16:32:26.850 に答える