函数名: memset
功 能: 设置s中的所有字节为ch, s数组的大小由n给定
用 法: void *memset(void *s, char ch, unsigned n);
(1)你用的应该不对吧
(2)至于下面的赋值,我不懂jstring是什么?
功 能: 设置s中的所有字节为ch, s数组的大小由n给定
用 法: void *memset(void *s, char ch, unsigned n);
(1)你用的应该不对吧
(2)至于下面的赋值,我不懂jstring是什么?
解决方案 »
- 哪位大侠用JMX监控过JBOSS服务器(取JBOSS服务器基本信息以及运行时候的性能信息) 给点代码例子 100分奉上
- spring注入的问题
- 用eclipse applet嵌入网页的问题,在线等,大哥帮忙啊
- 下载文件左健点击就弹出下载对话框的html怎么写呢?
- jsp中用JDBC连接oracle10i数据库的问题,请求大家帮助
- 有没有用jsp与数据库(最好是SQL)做的csdn左边的那个树型结构的源代码啊?
- 在weblogic 8.1下配置好连接池,但是JNDI查询不到
- 一个框架的两个页面传递参数问题
- structs问题请教,我在tomcat中部署时,在控制台报以下错误,请教一下什么原因!
- 增加列的数据库问题
- 有什么好的所见即所得的开发工具来开发JSP应用程序呢?请高手指教
- 论坛总是重复登陆怎么办?
我也有过这样的经历。后来改成字符数组,大概成功了,
太久远了,明天帮你看看。 请教 toney_2001(toney),您能否指点一二jstring的用法?万分感谢!!!
http://java.sun.com/products/jdk/1.2/docs/guide/jni/spec/types.doc.html#15773
我现在传int、char都可以的,但传string、char[]都不行,都会出现上述错误。
怎么办呢?高手帮忙啊。
vc的trydll中实现Justtry函数:
JNIEXPORT jcharArray JNICALL Java_test_Justtry
(JNIEnv *env, jobject obj)
{
char temp[100] = "test 12345";
return temp;}再在java中调用
char buff[]= new char[100];
buff = Justtry();
就会出现java.lang.NullPointerException的问题。
如何能在java中得到Justtry()的值??????
急!!!!
各位大哥多帮忙小女子啊。谢谢~~~~~~~!!!!
现在给你解答 :)java中的字符串参数是16位unicode字符;c中的字符串是以null结尾,其字节以一个字节表示。java本地接口(jni)有两类函数,一类是将java字符串转化为utf;另一类是把
他们转换为unicode字符数组,即jchar数组。JNI函数用来读取和创建jstring对象。
NewStringUTF()函数从一个包含utf格式编码字符的char类型数组中创建一个jstring对象。
不过,JNI函数的调用方式有点奇怪,这里给你一个使用NewStringUTF()函数的例子。
JNIEXPORT jint JNICALL Java_Hello_GetMsg
(JNIEnv *env, jobject obj, jstring ch)
{
HINSTANCE hLibrary;
_GETMSG GetMsg;
int temp;
int res;
char msg[256];
GetMsg=(_GETMSG)GetProcAddress(hLibrary,"GetMsg");
res = GetMsg(msg);
printf("getmsg in trydll,res:%d\n",res);
printf(msg);
ch = (*env) ->NewStringUTF(env, msg);
FreeLibrary(hLibrary);
return ch;
}
GOOD LUCK!! :)
env指针是指向一个函数指针表的指针(如图),因此,必须在每个jni函数访问前加前缀
(*env)->,以确保间接引用函数指针。使用时只需提供(*env)->前缀,无需关心
函数指针表。
_____________ _____________ ______________
env | ----|---->| ----|--->| 保留 |
------------- ------------- --------------
| 。 | | 保留 |
| 。 | --------------
| 。 | | 保留 |
------------- --------------
| 保留 |
--------------
| GetVersion --|--->
--------------
| Define Class -|--->
---------------
| Find Class ---|--->
---------------
| 。 |
| 。 |
| 。 |
---------------
hehe
good luck! :)
非常感谢你的意见,我试过了,现在可以传递字符串了。但是传递数字和字母可以,传递中文不可以啊,显示出来全部是问号。能再给点意见吗?
谢谢了,帅哥!!!
API : Accessing Java strings from C code
·jstring NewStringUTF(JNIEnv* env, const char bytes[])
从UTF字符串中返回一个新的Java字符串对象,若不能创建该字符串对象,则返回null。
参数:
env JNI接口指针,下同
bytes 以null结尾的UTF字符串·jsize GetStringUTFLength(JNIEnv* env, jstring str)
返回UTF编码所需的字符个数
参数:
str Java字符串对象·const jbyte* GetStringUTFChars(JNIEnv* env, jstring str, jboolean* isCopy)
返回指向字符串的UTF编码的指针,若不能创建,返回null。
该指针在调用ReleaseStringUTFChars()之前一直有效。
参数:
str Java字符串对象
isCopy 若进行拷贝,指向以JNI_TRUE填充的jboolean,
否则指向以JNI_FALSE填充的jboolean·Void ReleaseStringUTFChars(JNIEnv* env, jstring str, const jbyte bytes[])
通知虚拟机本地代码不再需要通过bytes访问Java字符串
参数:
str Java字符串对象
bytes 由GetStringUTFChars返回的指针·jstring NewString(JNIEnv* env, jchar chars[], jsize length)
返回基于Unicode字符串的新Java字符串对象,若不能创建该对象则返回null。
参数:
bytes 以null结尾的UTF字符串
length 字符串中的字符数目·jsize GetStringLength(JNIEnv* env, jstring string, jboolean* isCopy)
返回字符串中的字符个数
参数:
string Java字符串对象
·const jchar* GetStringChars(JNIEnv* env, jstring string, jboolean* isCopy)
返回指向一个字符串的Unicode编码的指针,若不能创建该字符数组返回null。
该指针在调用ReleaseStringChars()前一直有效。
参数:
string Java字符串对象
isCopy 若进行拷贝,指向为null或以JNI_TRUE填充的jboolean,
否则指向以JNI_FALSE填充的jboolean·Void ReleaseStringChars(JNIEnv* env, jstring string, const jchar chars[])
通知虚拟机本地代码不再需要通过chars访问Java字符串。
但是我今天试了试,没有utf的那一类传出的结果只是字符串的
首字符。
你可以自己试试。试通了告我一声。 谢谢!! :)
JNIEXPORT jint JNICALL Java_Hello_GetMsg
(JNIEnv *env, jobject obj, jstring ch)
{
HINSTANCE hLibrary;
_GETMSG GetMsg;
int temp;
int res;
char msg[256];
jsize length; //添加该变量
GetMsg=(_GETMSG)GetProcAddress(hLibrary,"GetMsg");
res = GetMsg(msg); length = msg.length;//赋值 printf("getmsg in trydll,res:%d\n",res);
printf(msg);
ch = (*env) ->NewString(env, msg, length);
FreeLibrary(hLibrary);
return ch;
}试试看,别灰心,没准你是第一个成功的(我知道的人当中 :)),
我最近工作忙,而且……,算了,有些事情不好在这儿说。
祝你成功!:)
·jsize GetStringLength(JNIEnv* env, jstring string, jboolean* isCopy)
·const jchar* GetStringChars(JNIEnv* env, jstring string, jboolean* isCopy)
·Void ReleaseStringChars(JNIEnv* env, jstring string, const jchar chars[])
这三个方法。但是换成这类方法后接收到从java传过来的字符串不全。而用以下这类方法则传输中文错误:
·jsize GetStringUTFLength(JNIEnv* env, jstring str)
·const jbyte* GetStringUTFChars(JNIEnv* env, jstring str, jboolean* isCopy)
·Void ReleaseStringUTFChars(JNIEnv* env, jstring str, const jbyte bytes[])不知那位高手能够搞定,帮帮忙,我可以另开贴子给分 :)
jstring CreateJString(JNIEnv* env,const char* s)
{
if (s == NULL)
return NULL;
USES_CONVERSION;
LPOLESTR ss = A2OLE(s);
return env->NewString(
(const jchar*)ss,(jsize)lstrlenW(ss));
}
jstring CreateJString(JNIEnv* env,const char* s)
{
if (s == NULL)
return NULL;
WCHAR buffer = new char[lstrlen(s)+1];
int len = ::MultiByteToWideChar(CP_ACP,NULL,s,lstrlen(s),buffer,lstrlen(s)+1);
return env->NewString(buffer,(jsize)len);
}