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

使用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 ) {

jclassJClsString;//java的String类的类指针

jmethodIDJMthdStringGetbytes;//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;

jclassJClsString;//java的String类的类指针

jmethodIDJMthdStringInit;//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;

}

谢谢!

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

weixin_39798943

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值