当前位置: 技术问答>java相关
jni调用C程序dll产生的疑惑,300分寻找大虾
来源: 互联网 发布时间:2015-03-20
本文导语: 任务:调用一个C写的dll里面的一个方法 步骤:1,写一个newdll包含jni要的接口,再调用olddll 2,用java的native方法调用newdll,结果程序在olddll的 方法里面终止,非正常退出。 java的native方法传递一个Strin...
任务:调用一个C写的dll里面的一个方法
步骤:1,写一个newdll包含jni要的接口,再调用olddll
2,用java的native方法调用newdll,结果程序在olddll的
方法里面终止,非正常退出。
java的native方法传递一个String给C,
fileName=(*env)->GetStringUTFChars(env,jFileName,0);
abs_rtn=RunDllTest(fileName);//这里终止了程序
(*env)->ReleaseStringUTFChars(env, jFileName, fileName);
printf("return:%d",abs_rtn);
最后printf没有输出东西。奇怪的是我用C写的main方法调用该dll结果是
正确的,abs_rtn返回0。
void main(int argc,char *arg[]){
int abs_rtn;
abs_rtn=RunDllTest(arg[1]);
printf("return:%d",abs_rtn);
}
问题:java传递String和C本身传递有区别吗?先用GetStringUTFChars把String 的unicode转换成ascii码字符串了,其中还存在问题?在java调用中fileName输出是正确的,用printf输出看说明调用和传递成功了,但程序在使用该变量的方法里面终止了,问题何在呢??
步骤:1,写一个newdll包含jni要的接口,再调用olddll
2,用java的native方法调用newdll,结果程序在olddll的
方法里面终止,非正常退出。
java的native方法传递一个String给C,
fileName=(*env)->GetStringUTFChars(env,jFileName,0);
abs_rtn=RunDllTest(fileName);//这里终止了程序
(*env)->ReleaseStringUTFChars(env, jFileName, fileName);
printf("return:%d",abs_rtn);
最后printf没有输出东西。奇怪的是我用C写的main方法调用该dll结果是
正确的,abs_rtn返回0。
void main(int argc,char *arg[]){
int abs_rtn;
abs_rtn=RunDllTest(arg[1]);
printf("return:%d",abs_rtn);
}
问题:java传递String和C本身传递有区别吗?先用GetStringUTFChars把String 的unicode转换成ascii码字符串了,其中还存在问题?在java调用中fileName输出是正确的,用printf输出看说明调用和传递成功了,但程序在使用该变量的方法里面终止了,问题何在呢??
|
http://java.sun.com/docs/books/tutorial/native1.1/stepbystep/index.html
上面都很简单的调用,他问的是调用成功出现的问题。
“在java调用中fileName输出是正确的,用printf输出看说明调用和传递成功了,但程序在使用该变量的方法里面终止了,问题何在呢??”
我看是jvm和C变量转变问题,
fileName=(*env)->GetStringUTFChars(env,jFileName,0);函数有问题
fileName指向的字符串应该复制一份到C程序中
上面都很简单的调用,他问的是调用成功出现的问题。
“在java调用中fileName输出是正确的,用printf输出看说明调用和传递成功了,但程序在使用该变量的方法里面终止了,问题何在呢??”
我看是jvm和C变量转变问题,
fileName=(*env)->GetStringUTFChars(env,jFileName,0);函数有问题
fileName指向的字符串应该复制一份到C程序中
|
http://java.sun.com/docs/books/tutorial/native1.1/stepbystep/index.html
|
哦
jboolean iscopy=JNI_FALSE;
或者JNI_TRUE,不知道有什么不同,看看哪个可以就
用咯
jboolean iscopy=JNI_FALSE;
或者JNI_TRUE,不知道有什么不同,看看哪个可以就
用咯
|
fileName=(*env)->GetStringUTFChars(env,jFileName,0);后首先把fileName中的内容memcpy到另一个char*中,另外,你RunDllTest()函数做了什么操作?