2013-10-23 45 views
0

我使用JNI在C++程序中调用一些Java代码。我需要从Java打印一些文本到C++ stdout。来自C++的JNI Java;打印输出?

我该怎么办?

我尝试:System.out.println("sdf");在java中,什么都没有出现。

请帮助:d

回答

3
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); 
} 
+1

这使得代码有两个假设:1)Unicode是所需的字符集,而UTF-8是所需的编码。 2)'cout'不会因非GetStringUTFChars产生的非标准的_modified UTF-8编码而窒息。它可以在可能的字符串的子集上工作,但它不检查它,也不记录它。 –

1

您可以通过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); 
} 
+0

你的代码是C,但问题是标记为C++。 –

0

既然你没有指定一个字符集和编码,本地方法应该处理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 
} 

如果你知道你想要一个特定的字符集/编码(又名“代码页”),你可以通过CharsetString.getBytes