我试图在JNI中致电system.out.println
。我怎样才能做到这一点?以下是我到目前为止的情况:
jclass cls = env->FindClass("java/lang/System");
jmethodID constructor = env->GetStaticMethodID(cls, "out", "()Ljava.out.PrintStream;");
答案 0 :(得分:3)
这不是一件简单的事 首先,正如您所做的那样,您必须获得java.lang.System类 在该类中是静态成员“out”,其类型为java.io.PrintStream 你想调用那个严重超载的类的println()方法 通过调用println()的String版本来简化这一点。 所有这些都是一个冗长的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);