Android JNI中的C代码-printf()输出到哪里?

u91tlkcl  于 5个月前  发布在  Android
关注(0)|答案(1)|浏览(103)

我正在将一个C代码应用程序移植到Android中,我正在使用Java本机接口来混合C和Java代码。
我得到了下面的代码,编译和运行没有问题。
我想知道printf()输出的位置,因为我找不到它:

#include <jni.h>
#include <string>
#include <stdio.h>

int sum(int a, int b);

extern "C" JNIEXPORT jstring

JNICALL Java_com_example_first_1c_MainActivity_stringFromJNI(JNIEnv *env, jobject /* this */)
{
    int a;
    int b;
    int c;
    std::string hello = "Hello from C++";

    a = 10;
    b = 20;
    c = sum(a, b);

    return env->NewStringUTF(hello.c_str());
}

int sum(int a, int b)
{
    int sum;

    sum = a + b;

    printf("Sum = %d", sum);

    return sum;
};

字符串

fae0ux8s

fae0ux8s1#

printf()使用stdout作为输出,这是JNI可以改变的。这个FILE *描述符通常与UNIX文件描述符1相关联,所以它取决于你是如何启动程序的。很常见的是,unix应用程序没有将标准输出重定向到某些特定位置,就会丢失输出(主要是因为它们将输出重定向到/dev/null)。
你是从Linux控制台启动Java程序吗?你是从脚本启动它吗?检查Java虚拟机是如何启动的,会告诉你标准输出的位置。由于Linux中的Java使用System.out来引导其输出,很可能你将无法在JNI模块中使用stdio包函数。
无论如何,stdio是一个缓冲其输出的模块,如果您只是调用printf(),只需在调用后调用fflush(stdout);,以强制将缓冲区写入输出通道,或者在使用printf()之前调用setbuf(stdout, NULL);。这将确保printf()在每次调用时刷新缓冲区,然后你在某个地方得到了你的输出。很可能你的输出没有显示出来,因为它仍然在缓冲区中。我建议你至少做以下几件事:

int sum(int a, int b)
{
    int sum;

    sum = a + b;

    printf("Sum = %d\n", sum);
    fflush(stdout);

    return sum;
} // ;  /* <-- never end a function body with a semicolon */

字符串

相关问题