0

我使用 JNI 在 C++ 程序中调用一些 Java 代码。我需要将一些文本从 Java 打印到 C++ 标准输出。

我该怎么做?

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

请帮助:D

4

3 回答 3

5
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);
}
于 2013-10-23T17:37:36.093 回答
2

您可以尝试通过 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);
}
于 2013-10-23T17:37:35.050 回答
1

由于您没有指定字符集和编码,本机方法应该处理 Java 确定为平台默认值的内容。否则,“You win 100€”不会像“You win 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
}

如果您确实知道所需的特定字符集/编码(又名“代码页”),则可以将 a 传递CharsetString.getBytes

于 2013-10-25T01:56:22.407 回答