Java 调用方法JNI
我正在使用JNI用Java编程。 我已经配置了所有的NetBeans 当在C方法中调用Java方法时,获得的结果将显示在同一C方法中的其他操作之前。我附上一些代码 这里是C代码,在main中调用了两次:Java 调用方法JNI,java,java-native-interface,Java,Java Native Interface,我正在使用JNI用Java编程。 我已经配置了所有的NetBeans 当在C方法中调用Java方法时,获得的结果将显示在同一C方法中的其他操作之前。我附上一些代码 这里是C代码,在main中调用了两次: JNIEXPORT void JNICALL Java_jnidemojava_Main_myprint (JNIEnv *env, jobject obj){ jfieldID fldid; jint nx, nnx; (void)printf("Hello from a Na
JNIEXPORT void JNICALL Java_jnidemojava_Main_myprint
(JNIEnv *env, jobject obj){
jfieldID fldid;
jint nx, nnx;
(void)printf("Hello from a Native Method\n");
if (obj == NULL) {
fprintf(stderr, "Input pointer is null!\n");
return;
}
if ((fldid = (*env)->GetFieldID(env,
(*env)->GetObjectClass(env, obj), "x", "I")) == NULL) {
fprintf(stderr, "GetFieldID failed");
return;
}
nx = (*env)->GetIntField(env, obj, fldid);/* retrieve myNumber */
printf("\"myNumber\" value is %d\n", nx);
(*env)->SetIntField(env, obj, fldid, ++nx);/* increment it! */
nnx = (*env)->GetIntField(env, obj, fldid);
printf("\"myNumber\" value now %d\n", nnx); /* make sure */
if(nnx==10){
//richiama un metodo di Main
//jclass myClass = (*env)->FindClass(env, "Main");
jclass myClass = (*env)->GetObjectClass(env, obj);
jmethodID myMethod = (*env)->GetMethodID(env, myClass, "method", "(I)V");
int c=100;
(*env)->CallIntMethod(env, obj, myMethod,c);
printf("CALLED!");
}
这里是C调用的java方法:
public void method(int c) throws InterruptedException{
System.out.println("Method called from C "+c);
}
一切正常,但我不明白为什么输出顺序是错误的
输出
Method called from C 100
"myNumber" value is 8
"myNumber" value now 9
"myNumber" value is 9
"myNumber" value now 10
CALLED!
BUILD SUCCESSFUL (total time: 0 seconds)
谢谢。看起来printf方法/或stdou没有内部缓冲区。如果需要正确的顺序,可以刷新stdout:
fflush(stdout)代码>你是对的!谢谢你,罗伯特!可能重复的