Java JNI-在main()中调用本机方法太晚

Java JNI-在main()中调用本机方法太晚,java,java-native-interface,Java,Java Native Interface,我使用JNI使我的java程序与C库一起工作,但调用本机方法太晚了 这是我的密码: public class QuadcopterClient{ static { try { System.loadLibrary("MPU6050"); System.out.println("libMPU6050.so loaded."); } catch (UnsatisfiedLinkError e) { System.err.println(

我使用JNI使我的java程序与C库一起工作,但调用本机方法太晚了

这是我的密码:

public class QuadcopterClient{
static {
    try {
        System.loadLibrary("MPU6050");
        System.out.println("libMPU6050.so loaded.");
    } catch (UnsatisfiedLinkError e) {
        System.err.println("Couldn't load MPU6050: " + e.toString());
    }
}

public native void HelloWorld();

public static void main(String argv[]) {

    System.out.println("Trying invoke native method");
    QuadcopterClient qc = new QuadcopterClient();
    for (int i = 0; i < 10; i++) {
        qc.HelloWorld();
    }
    System.out.println("Method invoked.");

    Thread.sleep(2500);
}
公共类QuadcopterClient{
静止的{
试一试{
系统加载库(“MPU6050”);
System.out.println(“libMPU6050.so加载”);
}捕获(未满足链接错误e){
System.err.println(“无法加载MPU6050:+e.toString());
}
}
公共本机void HelloWorld();
公共静态void main(字符串argv[]){
System.out.println(“尝试调用本机方法”);
QuadcopterClient qc=新的QuadcopterClient();
对于(int i=0;i<10;i++){
qc.HelloWorld();
}
System.out.println(“调用的方法”);
睡眠(2500);
}
然后我运行它

pi@raspberrypi~/local/quadcopterClient$java-jar-Djava.library.path=.dist/quad*
libMPU6050.so已加载。
尝试调用本机方法
方法调用。
Hello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello世界

你可以看到“Hello world”出现在节目的结尾

QuadcopterClient类位于“QuadcopterClient”florder中:

pi@raspberrypi~/local/quadcopterClient/src$ls
AccGyroModule客户端服务器模块控制器模块电机模块四端口客户端共享库


为什么?Thx

stdout
是缓冲的。您需要调用
fflush(stdout);
,或者可能在消息中添加一个换行符,以便行缓冲刷新消息(如果有效的话)。

这将有助于您提供更多缺少的函数,并稍微简化您的代码。
QuadcopterClient.HelloWorld()
?您应该去掉
ControlerModule
创建并用sleep替换它(这样您仍然可以
^C
代码,但不需要在示例中执行所有有趣的网络连接操作。)我猜该方法是按时调用的,但它打印的字符串只是缓冲的,在应用程序终止之前,缓冲区不会刷新。在打印字符串时,只需尝试添加换行符
\n
,这通常有助于提前刷新输出。谢谢,这可能会有所帮助。首先,我需要按时调用方法。您的方法正在t运行他说得对。因为缓冲,你直到后来才看到它的输出。@Jurass它确实有帮助。你从观察中得出了错误的结论。调用方法时会调用它们。