很奇怪的有关问题,传入的参数相同,为什么返回结果不一样

很奇怪的问题,传入的参数相同,为什么返回结果不一样。
本帖最后由 lgmsyy 于 2014-04-03 18:57:04 编辑
----------------------------Testc.c 普通C
p1,p2 是C中对应的unsigned char *变量   
     
result = _Info(p1, p2);   //调用第三方SO提供的函数
printf("%f\n", result);//结果假设为0.36

----------------------------TestJava.c 符合JNI规范的C
JNIEXPORT jint JNICALL Java_com_Hello_EXECUTE{.....
....
 
p1,p2 是JAVA中对应的byte[]数组      
通过JNI的方式传递给C语言             
result = _Info(p1, p2);//调用第三方SO提供的函数
printf("%f\n", result);//结果为什么和直接C调用的不一样???结果假设为1
}
********************************
我以为是我传的参数不对,所以在以上两个程序中分别进行了
int i=0;
printf("\n--------------\n");
for(i=0;i<size;i++){
 printf("%d", p1[i]);
}
printf("\n--------------\n");
i=0;      
for(i=0;i<size;i++){
 printf("%d", p2[i]);
}
printf("\n-------------------------\n");

发现打印出来内容是一样的,但为什么输出的结果却不宜样呢。
------解决方案--------------------
JNI处理数组的问题吧。
------解决方案--------------------
引用:
Quote: 引用:

JNI处理数组的问题吧。


我以为是我传的参数不对,所以在以上两个程序中分别进行了
int i=0;
printf("\n--------------\n");
for(i=0;i<size;i++){
 printf("%d", p1[i]);
}
printf("\n--------------\n");
i=0;      
for(i=0;i<size;i++){
 printf("%d", p2[i]);
}
printf("\n-------------------------\n");

发现打印出来内容是一样的,但为什么输出的结果却不宜样呢。

能在第三方库里编辑的话那就在出口打印返回值啊,还以为你是分别在传入的地方调用呢。
------解决方案--------------------
java应该没有指针这个东西吧!
在c语言中,数组作为参数传递时和指针是相同的!在java中数组传参会不会有不同呢?
------解决方案--------------------
是不是因为java的byte型数组是signed char型的缘故,你把c里面的unsigned char 改为signed char 看看输出是否一样。
------解决方案--------------------
如果传入前打印是一样, 那传入后呢?

函数中执行过程呢?

这种东西调试基本上就可以解决的, 光是看代码, 也"猜"不出结果的.
------解决方案--------------------
你printf应该这样写:

//c的字符串是'\0'结尾的
printf(p1);

//java的字符串是以'\0'结尾的吗 ?
printf(p2);

你对比一下两个结果,我觉得可能结果会不同,java的会长一些或者短一些。
------解决方案--------------------
我也在怀疑是不是通过jni的标准调用的那个会不会是因为会自动四舍五入小数的问题
------解决方案--------------------
在java里,'\0'会被转义为0x80什么的,我记不清了,04年我在湖南时就发现这个问题,java里没有0x00,因此字符串结束不能依靠0值实现,必须由结构数据替代,即:长度、数据方式
staruct string{
unsigned n;
char *s;
};
为方便使用,你也可以采用:
union{
  struct {unsigned short n;
     char *s;}str;
  char *dat;
};
在调用的时候通过结构将数据转储出来