我使用JNI在C++程序中调用一些Java代码。我需要从Java打印一些文本到C++ stdout。来自C++的JNI Java;打印输出?
我该怎么办?
我尝试:System.out.println("sdf");
在java中,什么都没有出现。
请帮助:d
我使用JNI在C++程序中调用一些Java代码。我需要从Java打印一些文本到C++ stdout。来自C++的JNI Java;打印输出?
我该怎么办?
我尝试:System.out.println("sdf");
在java中,什么都没有出现。
请帮助:d
public class Natives {
public static native void printf(final String WhatToPrintHere);
}
public class Main {
public static void main(String args[]) {
Natives.printf("Testing printing from Java");
}
}
extern "C" JNIEXPORT void Java_Natives_printf(JNIEnv* env, jobject obj, jstring WhatToPrintHere)
{
const char* Str = env->GetStringUTFChars(WhatToPrintHere, 0);
std::cout<< Str <<"\n";
env->ReleaseStringUTFChars(WhatToPrintHere, Str);
}
您可以通过JNI尝试调用printf像这样:(从wiki)
JNIEXPORT void JNICALL Java_ClassName_MethodName
(JNIEnv *env, jobject obj, jstring javaString) {
// printf("%s", javaString); // INCORRECT: Could crash VM!
// Correct way: Create and release native string from Java string
const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0);
printf("%s", nativeString);
(*env)->ReleaseStringUTFChars(env, javaString, nativeString);
}
你的代码是C,但问题是标记为C++。 –
既然你没有指定一个字符集和编码,本地方法应该处理Java认为是平台默认的东西。否则,它会只是巧合,“你赢100€”不能打印像“你赢100á,¬”
所以,声明它想:
public static native void println(final byte[] stringBytes);
这样称呼它:
Natives.println("You win 100€".getBytes()); // platforms default character set/encoding
并执行它想:
extern "C" JNIEXPORT void JNICALL Java_Natives_println(JNIEnv *env, jclass, jbyteArray stringBytes)
{
auto bytes = (env->GetByteArrayElements(stringBytes, 0)); // is_copy is not used
auto str = reinterpret_cast<const char *>(bytes);
std::cout << str << std::endl;
env->ReleaseByteArrayElements(stringBytes, bytes, JNI_ABORT); // no need to copy back
}
如果你知道你想要一个特定的字符集/编码(又名“代码页”),你可以通过Charset
到String.getBytes
这使得代码有两个假设:1)Unicode是所需的字符集,而UTF-8是所需的编码。 2)'cout'不会因非GetStringUTFChars产生的非标准的_modified UTF-8编码而窒息。它可以在可能的字符串的子集上工作,但它不检查它,也不记录它。 –