我正在尝试在 JNI 中调用 system.out.println
。我怎样才能做到这一点?这是我目前所拥有的:
jclass cls = env->FindClass("java/lang/System");
jmethodID constructor = env->GetStaticMethodID(cls, "out", "()Ljava.out.PrintStream;");
最佳答案
这不是一件简单的事情。
首先,正如您所做的那样,您必须获取 java.lang.System 类。
在该类中有一个静态成员“out”,类型为 java.io.PrintStream。
您想调用该类的 println() 方法,该方法重载。
通过调用 println() 的字符串版本来简化这一点。
所有这些都构成了一个冗长的 JNI 事务,但它是这样的。
买者自负:我没有编译和运行这段代码,但它基于我们在生产中使用的自动生成的 JNI 包装器代码。
// Get system class
jclass syscls = env->FindClass("java/lang/System");
// Lookup the "out" field
jfieldID fid = env->GetStaticFieldID(syscls, "out", "Ljava/io/PrintStream;");
jobject out = env->GetStaticObjectField(syscls, fid);
// Get PrintStream class
jclass pscls = env->FindClass("java/io/PrintStream");
// Lookup printLn(String)
jmethodID mid = env->GetMethodID(pscls, "println", "(Ljava/lang/String;)V");
// Invoke the method
jchar *cppstr = // make an array of jchar (UTF-16 unsigned short encoding)
jstring str = env->NewString(cppstr, length);
env->CallVoidMethod(out, mid, str);
关于java-native-interface - 如何通过 JNI 从 C++ 调用 system.out.println?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25417792/