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

of 的第一个参数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不是CallVoidMethod. 然后你可以完全省略第一个jobject参数。

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