簡體   English   中英

來自C ++的JNI Java; 打印輸出?

[英]JNI Java from C++ ; Print to output?

我正在使用JNI在C ++程序中調用一些Java代碼。 我需要從Java到C ++ stdout打印一些文本。

我該怎么做?

我嘗試: 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);
}

由於未指定字符集和編碼,因此本機方法應該處理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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM