我正在将一个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;
};
字符串
1条答案
按热度按时间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()
在每次调用时刷新缓冲区,然后你在某个地方得到了你的输出。很可能你的输出没有显示出来,因为它仍然在缓冲区中。我建议你至少做以下几件事:字符串