写JNI第一步自然是定义Java端Native方法,然后javah生成C/C++端头文件。要注意的地方有:
1. UnsatisfiedLinkError
如果生成头文件时的Java类和后来使用该DLL的Java类不是同一个package,则会产生UnsatisfiedLinkError错误。
2. 字符串数组需要当作Object数组来处理
jobjectArray args = 0;
args = env->NewObjectArray(retnum,env->FindClass("java/lang/String"),0);
for(int i=0;i<retnum;i++){
...
str = env->NewStringUTF(buffer);
env->SetObjectArrayElement(args, i, str);
}
return args;
3. 如果返回值包含中文,需特殊处理
jstring WindowsTojstring( JNIEnv* env, const char* str )
{
jstring rtn = 0;
int slen = strlen(str);
unsigned short * buffer = 0;
if( slen == 0 )
rtn = (env)->NewStringUTF(str );
else
{
int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
buffer = (unsigned short *)malloc( length*2 + 1 );
if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
rtn = (env)->NewString( (jchar*)buffer, length );
}
if( buffer )
free( buffer );
return rtn;
}