当前位置: 技术问答>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类型参数的函数应该如何附值呀?
谢谢!
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; //非正常退出
}
//函数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;
}
谢谢!
JNIEXPORT jstring JNICALL Java_HelloNative_getGreeting
(JNIEnv * env,jclass cl)
{
jstring jstr;
jstr=NewStringUTF("Hello,Native Worldn");
return jstr;
}
谢谢!