use*_*569 3 java-native-interface
我正在尝试调用system.out.printlnJNI。我怎样才能做到这一点?这是我到目前为止所拥有的:
jclass cls = env->FindClass("java/lang/System");
jmethodID constructor = env->GetStaticMethodID(cls, "out", "()Ljava.out.PrintStream;");
Run Code Online (Sandbox Code Playgroud)
这不是一件简单的事情。
首先,正如您所做的那样,您必须获取 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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2805 次 |
| 最近记录: |