如何从C调用Java方法(不首先从Java调用C)
How do I call a Java method from C (without first calling C from Java)
因此,如果您想从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",它不会打印任何内容。
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);
相关文章:
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- 尝试在 QT 项目中调用 Java 代码时未找到类异常
- Android:使用 c++ 中的 byte[] 参数调用 java 方法
- 如何在JNI中从线程内部调用JAVA方法
- 无法使用 JNI 从C++模块成功调用 Java 函数
- Android 无法从本机代码调用 Java 方法 JNI
- Android NDK - 引用 JNIEnv 从C++调用 Java
- 我可以通过CPP程序中的数据库调用调用Java程序
- 使用 JNI 从 cpp 调用 java 方法时出现异常
- 如何使JNI RegisterNatives调用Java函数具有C++实例范围
- 在Qt中从C ++调用Java方法
- 使用C 获取Java对象来调用Java方法
- 在QT中调用Java功能
- JNI:从C++调用JAVA方法,返回对象,引用和GC
- 从 Java 调用 c++,然后从相同的 c++ 方法调用 java 方法
- 安卓系统上的Qt蓝牙.通过抽象类上的jni调用java类
- 从Android NDK SIGSEGV调用Java方法
- 从C++调用 java 代码:exception java.lang.NoSuchMethodError
- Android NDK调用java方法表单cpp
- 从Qt C++调用Java函数