我正在试着给JNI的system.out.println
打电话。我该怎么做呢?这是我到目前为止所知道的:
jclass cls = env->FindClass("java/lang/System");
jmethodID constructor = env->GetStaticMethodID(cls, "out", "()Ljava.out.PrintStream;");
发布于 2014-08-21 13:59:24
这不是一件简单的事情。
首先,正如您正在做的那样,您必须获取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);
https://stackoverflow.com/questions/25417792
复制