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 World\n");
return jstr;
}
谢谢!
JNIEXPORT jstring JNICALL Java_HelloNative_getGreeting
(JNIEnv * env,jclass cl)
{
jstring jstr;
jstr=NewStringUTF("Hello,Native World\n");
return jstr;
}
谢谢!
>结果经测试long与boolean类型的参数可以正确传递到DLL函数你测试成功了??如果DLL中函数原型是
SendMsg(long CommIndex,char * Msg,bool Chinese);
的话,我不太相信。
我的意思是:在JAVA中调用
MySendMsg(long CommIndex,String Msg,boolean Chinese);
其中String Msg是调用时动态指定的,而不是写死的,难到JAVA中没有动态参数
设置?你讲的jchar类型,在JAVA中如何定义才能用javac.exe 与javah.exe
倒出*.h中的函数原形,请再指教一下。
to xiaosongyu(松) :
long和boolean是可以传递的,就是String 好象不行。
http://www.hugkc.org/sigs/c/files/jniexamples.zip
可以参考一下,另外好好看一下JNI的文档
char *JNU_GetStringNativeChars(JNIEnv *env, jstring jstr)
方法,它的作用就是将jstring类型转化为char*,其实知道了很简单,就是先在C语言中调用java的String类型的getBytes方法,将java字符串对象转化为java的byte数组,然后再调用JNI函数GetByteArrayRegion将这个byte数组转化为C语言的char数组。
在刚学习JNI的时候,因为JNI的文档不够详细,如果没有人指导的话,在这个地方理解失误在所难免,我当时也是走了好多弯路才弄明白怎么回事的,jniexamples.zip里面的例子不错,好像是某一本书的实例代码,我认为是JNI入门的好东东,我极力向大家推荐!!
以下是我实现的代码,经验证可用,但中文string好象不行
JNIEXPORT jlong JNICALL Java_sm_MySendMsg
(JNIEnv *env, jobject, jlong jl1, jstring js1,jstring js2, jlong jl2, jboolean jb1)
{
const char *str1 =env->GetStringUTFChars(js1,0);
const char *str2 =env->GetStringUTFChars(js2,0);
char s1[50];
char s2[50];
strcpy(s1,str1);
strcpy(s2,str2);
env->ReleaseStringUTFChars(js1,str1);
env->ReleaseStringUTFChars(js2,str2);
}
//要转化的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 ) < 0 )
return 0; //内存不足
bytes = (jbyteArray) env->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, "<init>", "([B)V" );
if( JMthdStringInit == NULL )
return NULL; if( env->EnsureLocalCapacity( 2 ) < 0 )
return NULL; //内存不足
len = strlen( str );
bytes = env->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时采用了另外的一种办法,即把String作为一个普通的Object来操作,仔细看一下,应该也可以弄明白的。
我的代码也可能会有一些问题,欢迎大家一起帮我分析一下。