JNI 控制台信息,输出的顺序?

CCDDzclxy 2016-04-22 09:29:26
例子代码:
JAVA:

package jniZ;

public class JNIjw03
{
public int number = 0;//定义一个属性

//定义一个本地方法
public native void SayHello();

public static void main(String[] args)
{
//调用动态链接库
System.loadLibrary("JNIjwVC6_03");
JNIjw03 jni03 = new JNIjw03();
jni03.SayHello();
System.out.println("In Java number : "+jni03.number);
}
}


VC6代码:

#include<stdio.h>
#include "jniZ_JNIjw03.h"

JNIEXPORT void JNICALL Java_jniZ_JNIjw03_SayHello (JNIEnv * env, jobject obj)
{
printf("Java_jniZ_JNIjw03_SayHello - 1\n");

// 获取obj中对象的class对象
jclass clazz = env->GetObjectClass(obj);

// 获取Java中的number字段的id(最后一个参数是 属性number 的签名)
jfieldID id_number = env->GetFieldID(clazz, "number", "I");

// 获取number的值
jint number = env->GetIntField(obj, id_number);

// 输出到控制台
printf("In C++ number : %d\n", number);

// 修改number的值为100,这里要注意的是jint对应C++是long型 ∴后面要加一个"L"
env->SetIntField(obj, id_number, 100L);

printf("Java_jniZ_JNIjw03_SayHello - 2\n");
}



运行时没有问题的,Eclipse输出的信息为:

In Java number : 100
Java_jniZ_JNIjw03_SayHello - 1
In C++ number : 0
Java_jniZ_JNIjw03_SayHello - 2


我想问,为什么是这样的顺序?按照java的main函数中的代码执行顺序,不是应该 先打印出VC中的信息,然后再打印出System.out.println的信息吗?为什么 反而是 System.out.println 先被打印出来,然后才是 VC里面的信息?

这个现象让我理解起来 很困惑很费劲啊... 求指点,谢谢。





...全文
405 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengqian0819 2018-10-24
  • 打赏
  • 举报
回复
14楼正解,c语言fflush(stdout)就行。
hnlylyb 2018-08-01
  • 打赏
  • 举报
回复
其实跟跨进程通信啥的没关系,单纯的就是缓冲区的问题,如果你用的是c++的话加一个cout.flush()就能看出来结果了
家里敷泥呀 2016-04-25
  • 打赏
  • 举报
回复
引用 12 楼 CCDDzclxy 的回复:
[quote=引用 11 楼 Q80470101 的回复:] 你的测试结果呢,时间戳,是C++先,java后吗?
是的[/quote] ok 那就结贴吧
CCDDzclxy 2016-04-22
  • 打赏
  • 举报
回复
引用 1 楼 chaser401 的回复:
有可能这个连接库的方法时多线程的,所以先执行了System.out.println("In Java number : "+jni03.number);这条语句
我在 C++里面 有设置 number 的地方,设置完了number的值才会是100L。你这个说法 我有点 不接受...
chaser401 2016-04-22
  • 打赏
  • 举报
回复
有可能这个连接库的方法时多线程的,所以先执行了System.out.println("In Java number : "+jni03.number);这条语句
CCDDzclxy 2016-04-22
  • 打赏
  • 举报
回复
引用 11 楼 Q80470101 的回复:
你的测试结果呢,时间戳,是C++先,java后吗?
是的
家里敷泥呀 2016-04-22
  • 打赏
  • 举报
回复
引用 10 楼 CCDDzclxy 的回复:
[quote=引用 8 楼 Q80470101 的回复:] 如我们上面谈到的,这里涉及到跨进程通信,这个过程是耗时的,所以可能存在消息延迟。
OK,综合 你的回复,比较信服[/quote] 你的测试结果呢,时间戳,是C++先,java后吗?
CCDDzclxy 2016-04-22
  • 打赏
  • 举报
回复
引用 8 楼 Q80470101 的回复:
如我们上面谈到的,这里涉及到跨进程通信,这个过程是耗时的,所以可能存在消息延迟。
OK,综合 你的回复,比较信服
家里敷泥呀 2016-04-22
  • 打赏
  • 举报
回复
引用 8 楼 Q80470101 的回复:
[quote=引用 7 楼 CCDDzclxy 的回复:] [quote=引用 6 楼 Q80470101 的回复:] 不是0比100先打印,而是0比100的打印语句先发送。你把打印语句加上个时间戳试试。
恩 试试去。 那为啥 先发送的 后打印?[/quote] 如我们上面谈到的,这里涉及到跨进程通信,这个过程是耗时的,所以可能存在消息延迟。[/quote] 简单的说,就是C++的打印语句先发送,但是走的路远,后到达。Java的打印语句后发送,但是路近,就先到了。
家里敷泥呀 2016-04-22
  • 打赏
  • 举报
回复
引用 7 楼 CCDDzclxy 的回复:
[quote=引用 6 楼 Q80470101 的回复:] 不是0比100先打印,而是0比100的打印语句先发送。你把打印语句加上个时间戳试试。
恩 试试去。 那为啥 先发送的 后打印?[/quote] 如我们上面谈到的,这里涉及到跨进程通信,这个过程是耗时的,所以可能存在消息延迟。
CCDDzclxy 2016-04-22
  • 打赏
  • 举报
回复
引用 6 楼 Q80470101 的回复:
不是0比100先打印,而是0比100的打印语句先发送。你把打印语句加上个时间戳试试。
恩 试试去。 那为啥 先发送的 后打印?
家里敷泥呀 2016-04-22
  • 打赏
  • 举报
回复
引用 5 楼 CCDDzclxy 的回复:
[quote=引用 3 楼 Q80470101 的回复:] 你是通过java调用C++代码? 思考一个问题,你觉得执行System.out.println和printf这两个语句的,是同一个线程或进程吗?
1、是 通过java调用C++代码 2、关注一个时间点:就算不是同一个线程,至少也应该 C++代码 执行完之后,java中的number的值才是 100。至少 在信息"In C++ number : 0"被打印出来之后 ,java中的number的值才变成 100 ! ! ! 如果你说 是 两边的控制台信息有缓冲,不一定实时显示,我还觉得可能更可信一点...[/quote] 不是0比100先打印,而是0比100的打印语句先发送。你把打印语句加上个时间戳试试。
CCDDzclxy 2016-04-22
  • 打赏
  • 举报
回复
引用 3 楼 Q80470101 的回复:
你是通过java调用C++代码? 思考一个问题,你觉得执行System.out.println和printf这两个语句的,是同一个线程或进程吗?
1、是 通过java调用C++代码 2、关注一个时间点:就算不是同一个线程,至少也应该 C++代码 执行完之后,java中的number的值才是 100。至少 在信息"In C++ number : 0"被打印出来之后 ,java中的number的值才变成 100 ! ! ! 如果你说 是 两边的控制台信息有缓冲,不一定实时显示,我还觉得可能更可信一点...
aiyust070 2016-04-22
  • 打赏
  • 举报
回复
引用 3 楼 Q80470101 的回复:
你是通过java调用C++代码? 思考一个问题,你觉得执行System.out.println和printf这两个语句的,是同一个线程或进程吗?
right
家里敷泥呀 2016-04-22
  • 打赏
  • 举报
回复
你是通过java调用C++代码? 思考一个问题,你觉得执行System.out.println和printf这两个语句的,是同一个线程或进程吗?

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧