看到这个帖子http://topic.csdn.net/t/20020917/14/1030420.html#r_achor
按照最后那个例子进行操作
使用的是c++的文件,连接另一个库也是通过代码实现的
HINSTANCE HDll;
lpTrimFun Trim;
HDll=LoadLibrary("..这里是路径..\\Trim_Dll.dll");
Trim=(lpTrimFun)GetProcAddress(HDll,"Trim");
没有使用楼主提供的方式:cl -Id:\jdk13\include -Id:\jdk13\include\win32 -LD java2dll.c myDll.lib -Fejava2dll.dll 这样的话,由于GetStringUTFChars()的返回值是const char *类型,所以Trim(strTemp); 就会一直报错:无法将const char *转换成char *没弄明白那边的楼主是如何实现的。
另外想请教该如何转换GetStringUTFChars()的返回值,在c++中将其作为普通的字符串来处理?
按照最后那个例子进行操作
使用的是c++的文件,连接另一个库也是通过代码实现的
HINSTANCE HDll;
lpTrimFun Trim;
HDll=LoadLibrary("..这里是路径..\\Trim_Dll.dll");
Trim=(lpTrimFun)GetProcAddress(HDll,"Trim");
没有使用楼主提供的方式:cl -Id:\jdk13\include -Id:\jdk13\include\win32 -LD java2dll.c myDll.lib -Fejava2dll.dll 这样的话,由于GetStringUTFChars()的返回值是const char *类型,所以Trim(strTemp); 就会一直报错:无法将const char *转换成char *没弄明白那边的楼主是如何实现的。
另外想请教该如何转换GetStringUTFChars()的返回值,在c++中将其作为普通的字符串来处理?
现在主要是不明白,http://topic.csdn.net/t/20020917/14/1030420.html#r_achor这个帖子最后给出那个示例,为什么他的trim可以直接操作GetStringUTFChars()的返回值?
int length = (env)->GetStringLength(str );
const jchar* jcstr = (env)->GetStringChars(str, 0 );
char* rtn = (char*)malloc( length*2+1 );
memcpy(rtn,jcstr,length);
// Trim(rtn);
printf("%d\n",length);
printf("%s\n",rtn);str的内容是“i am the spider man!”,但是这样copy之后输出的只有一个i,其它什么都没有,length是20,按道理memcpy是完整复制,不会因为遇到字符串结束'\0'而结束,不过这里很奇怪,看来还是有必要进行编码转换的。
问题是由于jni导致的,不是单纯的c++的问题
const char* jcstr = (env)->GetStringUTFChars(str, 0 );
char* rtn = (char*)malloc( length );
memcpy(rtn,jcstr,length);
printf("%d\n",length);
printf("%s\n",rtn);这样呢
其实在JNI这层没必要非得用jchar,直接用char*也可以。
char * str=(char *)env->GetStringUTFChars(env,s,0);
这样以后对str的读取就是对传入的jString参数的读取了。但是要注意,java中的String是不能改变的,所以对str的写操作时不会返回给java层的s的