当前位置:  技术问答>java相关

求教高手:有关DLL调用中参数传递问题???

    来源: 互联网  发布时间:2015-09-19

    本文导语:  使用JNI调用DLL中的函数,DLL中函数原形: SendMsg(long CommIndex,char * Msg,bool Chinese); 在JAVA类中写成如下声明: public native long MySendMsg(long CommIndex,String Msg,boolean Chinese); JAVA中调用如下: System.out.println(mysm.MySendMsg(1,"参...

使用JNI调用DLL中的函数,DLL中函数原形:
SendMsg(long CommIndex,char * Msg,bool Chinese);
在JAVA类中写成如下声明:
public native long MySendMsg(long CommIndex,String Msg,boolean Chinese);
JAVA中调用如下:
System.out.println(mysm.MySendMsg(1,"参数传递测试abcd",true));

结果经测试long与boolean类型的参数可以正确传递到DLL函数,而String类型参数传递不成功,请问char *在JAVA中如何定义,在JAVA中调用带String类型参数的函数应该如何附值呀?
 

                                           谢谢!

|
下面是我以前写的部分代码,中文绝对没有任何问题,分别是从String到char*和从char*到String的转化,可以参考一下

//函数ChgStringNativeChars,用以将java的String类型转化为C++的字符串
//要转化的Java的String放在jstr中,返回结果在str中
//返回值:
// 0 错误
// 1 成功
int ChgStringNativeChars( JNIEnv *env, jobject jstr, char *str, int strlen ) {

jclass JClsString; //java的String类的类指针
jmethodID JMthdStringGetbytes; //java的String类的getbytes方法ID
jbyteArray bytes = NULL;
jthrowable excute; //定义异常,判断是否发生java异常使用

JClsString = env->FindClass( "java/lang/String" );
if( JClsString == NULL )
return 0;
JMthdStringGetbytes = env->GetMethodID( JClsString, "getBytes", "()[B" );
if( JMthdStringGetbytes == NULL )
return 0;

if( env->EnsureLocalCapacity( 2 ) CallObjectMethod( jstr, JMthdStringGetbytes ); //先将java的String转化为java的byte数组
excute = env->ExceptionOccurred(); //是否发生异常
if(!excute) { //未发生异常
jint len = env->GetArrayLength( bytes );
if( len >= strlen ) { //字符串超长
env->DeleteLocalRef( bytes );
return 0;
}
env->GetByteArrayRegion( bytes, 0, len, (jbyte *)str );
str[len]=NULL;
}
else { //发生异常
env->DeleteLocalRef( excute );
}
env->DeleteLocalRef( bytes );

return 1;
}


//函数NativeChgCharsString,用以将C++的字符串转化为java的String类型
//要转化的字符串放在str中
//返回值:
// NULL 错误
// jstring对象 成功
jstring ChgNativeCharsString( JNIEnv *env, char *str ) {

jstring jstr;
jclass JClsString; //java的String类的类指针
jmethodID JMthdStringInit; //java的String类的初始化方法的方法ID
jshort len;
jbyteArray bytes = NULL;

JClsString = env->FindClass( "java/lang/String" );
if( JClsString == NULL )
return NULL;
JMthdStringInit = env->GetMethodID( JClsString, "", "([B)V" );
if( JMthdStringInit == NULL )
return NULL;

if( env->EnsureLocalCapacity( 2 ) NewByteArray( len );
if( bytes != NULL ) {
env->SetByteArrayRegion( bytes, 0, len, (jbyte *)str );
jstr = (jstring) env->NewObject( JClsString, JMthdStringInit, bytes );
env->DeleteLocalRef( bytes );
return jstr; //正常退出
}
return NULL; //非正常退出
}


|
java本地接口定义了如下的一些类型jboolean,jbyte,jchar,jshort,jint,jlong,jfloat,jdouble,jstring,所以你的c中声明的char在使用JNI时要用jchar类型才可以,至于赋值给个简单的例子:
JNIEXPORT jstring JNICALL Java_HelloNative_getGreeting
(JNIEnv * env,jclass cl)
{
    jstring jstr;
    jstr=NewStringUTF("Hello,Native Worldn");
    return jstr;
}
谢谢!

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 求教求教,shell问题...各位大哥,帮忙下
  • 400分求教: 求教一简单问题,现场给分
  • 高分求教:如何将JAVA文件(.class)制作成可执行文件(.exe),求教方法或工具推荐
  • 急!!求教linux命令的使用:统计出/bin目录中文件的个数,追加到文件filea的结尾
  • 求教:在UNIX中查找包含指定文字的文件名
  • 小白菜求教linux大鸟
  • JDK1.3.1初级问题求教
  • 初学者有问题求教!
  • 各路高手请进!高分求教,非常着急!
  • 高分求教的问题(关于SendMail设置)
  • 数据库 iis7站长之家
  • 求教:知道当前时间,如何得到N天前的时间 ?
  • 求教:switch(condition)中的condition 必须为整型吗?
  • Linux远程访问的问题,高分求教:)
  • 求教:在Linux下如何做代理服务器?
  • 紧急求教!究竟Java里面有没有相当于C++的CPOINT的类阿?
  • 求教JAVA中XML解析问题
  • 50分求教,在JSP里如何将String转换成Double
  • 我刚装好,是不是需要配制环境变量?求教。
  • 400分求教JAVA皮肤的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3