java-native-interface - 如何通过 JNI 从 C++ 调用 system.out.println?

标签 java-native-interface

我正在尝试在 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/

相关文章:

java - 通过 native 代码从 jar 访问文件

android - 如何在Qt项目中使用Android NDK?

java - JVMTI - 如何从回调中获取方法参数的值

android - 在android中使用opencv将检测到的人脸与现有人脸数组进行比较

java - 从 JNI 创建 Java 枚举

java - 如何将 unsigned char 转换为 jbyteArray

java - 有没有办法在Java中内存映射大于Integer.MAX_VALUE的文件?

java - 从 native 代码分派(dispatch)的 pthread 可以回调到 JNI 吗?

java - Android JNI字符串问题

java - 如何从JAR文件的 `lib`子目录加载DLL?