JNI里的函数env->NewString()有人用过没有?

时间:2021-11-24 19:34:53
env->NewString(jchar*,jseize),现在我们一般用的字符串都是char *的,比如
char * ch="Hello,world";不知道怎么传进入jchar*这个参数位置?
看到一种方法是new出一个jchar *p=new jchar[n];p++=ch++;....类似的做法:把指针指向char的buffer块。要new内存,效率太低,不知道有没有替代方法?
btw我觉得这里好像懂JNI的人不多啊?

10 个解决方案

#1


别考虑效率的问题,JNI的效率就是很低的。jchar*和char*可以直接造型使用

另外你用NewString出来的东西Java应该取得乱码(长度不对)。应该用NewUTFString。这样至少保证英文传递正常。

传递中文的话看这里:

http://www.csdn.net/expert/topic/879/879400.xml

千万别给我分!!很重要!!别给我加分!!

#2


懂JNI的C时代的高手大多不来这个“破”论坛。

千万别给我分!!很重要!!别给我加分!!

#3


另外谁想出来的new一个jchar*的方法去将char*的内容复制过来?(这种方法……汗……)

千万别给我分!!很重要!!别给我加分!!

#4


千万别给我分!!很重要!!别给我加分!!
?
呵呵,那好。不过能不能加给我自己啊?

#5


new出来那个方法是我从IBM网站看到的,应该还是专业人士写的,我直接用char传给jchar编译通不过.

#6


不过我现在发现一个很奇怪的现象,调用java的c++代码做成一个子函数,然后char *ch传参数进去这个子函数作为被转化的字符串,我发现非得在这个子函数里面同样定义一个同样大小的buffer,比如是char tmp[size];//这个size必须和你参数传进来的ch一样的长度,否则它就会出错:内存不能read。加上这个定义tmp之后就ok。什么毛病啊?

#7


没读懂,把程序放上来看看吧。

jchar* str1;
str1= ......;
char* str2;
str2 = (char*)str1;

#8


另外还是不小心变成恶心的星星,现在可以随便加分了……

#9


Ok,程序架构是这样的:
void send(char *MsgText)
{.......
.......//创建jvm等操作
char szText0[10]; //the bigger size than MsgText
            //这个szText0没什么用处,但是没有它程序出错:内存不能读
jstring jMsgText=Tojstring(env,MsgText);
result=env->CallStaticBooleanMethod(cls, mid,jMsgText);
........
}
void main()
{
send("Hello");
 }
这样的错误真没有理由。

#10


Tojstring是什么?另外你有debug过是在哪里出错(不加哪句话)

C忘的真多啊,汗……

#1


别考虑效率的问题,JNI的效率就是很低的。jchar*和char*可以直接造型使用

另外你用NewString出来的东西Java应该取得乱码(长度不对)。应该用NewUTFString。这样至少保证英文传递正常。

传递中文的话看这里:

http://www.csdn.net/expert/topic/879/879400.xml

千万别给我分!!很重要!!别给我加分!!

#2


懂JNI的C时代的高手大多不来这个“破”论坛。

千万别给我分!!很重要!!别给我加分!!

#3


另外谁想出来的new一个jchar*的方法去将char*的内容复制过来?(这种方法……汗……)

千万别给我分!!很重要!!别给我加分!!

#4


千万别给我分!!很重要!!别给我加分!!
?
呵呵,那好。不过能不能加给我自己啊?

#5


new出来那个方法是我从IBM网站看到的,应该还是专业人士写的,我直接用char传给jchar编译通不过.

#6


不过我现在发现一个很奇怪的现象,调用java的c++代码做成一个子函数,然后char *ch传参数进去这个子函数作为被转化的字符串,我发现非得在这个子函数里面同样定义一个同样大小的buffer,比如是char tmp[size];//这个size必须和你参数传进来的ch一样的长度,否则它就会出错:内存不能read。加上这个定义tmp之后就ok。什么毛病啊?

#7


没读懂,把程序放上来看看吧。

jchar* str1;
str1= ......;
char* str2;
str2 = (char*)str1;

#8


另外还是不小心变成恶心的星星,现在可以随便加分了……

#9


Ok,程序架构是这样的:
void send(char *MsgText)
{.......
.......//创建jvm等操作
char szText0[10]; //the bigger size than MsgText
            //这个szText0没什么用处,但是没有它程序出错:内存不能读
jstring jMsgText=Tojstring(env,MsgText);
result=env->CallStaticBooleanMethod(cls, mid,jMsgText);
........
}
void main()
{
send("Hello");
 }
这样的错误真没有理由。

#10


Tojstring是什么?另外你有debug过是在哪里出错(不加哪句话)

C忘的真多啊,汗……