要注意的地方之一是,GetStringUTFChars后,要记得用ReleaseStringUTFChars来释放空间,否则会造成内存泄漏。
char*与jstring的相互转换行数,这个感觉好麻烦.
//jstring to char*
char* ConvertJini::jstringTostring(JNIEnv* env, jstring jstr)
{
errno_t err;
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("utf-8");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0)
{
rtn = (char*)malloc(alen + 1);
err = memcpy_s(rtn,alen + 1, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
return rtn;
}
//char* to jstring
jstring ConvertJini::stoJstring(JNIEnv* env, const char* pat)
{
size_t maxlen = 500;
jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, "
", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strnlen(pat,maxlen));
env->SetByteArrayRegion(bytes, 0, strnlen(pat,maxlen), (jbyte*)pat);
jstring encoding = env->NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
def文件:
LIBRARY "XclJiniLib" EXPORTS Java_com_xcl_jini_XclJini_GetVersion @1
C/C++需要从JDK中引入头文件jini.h,才能做编译。
C:\java\jdk\include;C:\java\jdk\include\win324. 编译出dll文件,将其用load或loadLibrary来加载C++动态库。
例子中,我将其复制到了C:\java\jdk\bin 下。
编译时要注意是32位还是64位,如位数不对,Java加载时会报下面的错:
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\java\jdk\bin\XclJiniLib.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1939) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1864) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854) at java.lang.Runtime.loadLibrary0(Runtime.java:845) at java.lang.System.loadLibrary(System.java:1084) at com.xcl.jini.XclJini.(XclJini.java:14)
__________________________ Java: jini 演示! java:C++ Message. __________________________ C++: GetVersion() Version 1.1 C++: GetStatus() C++: Running..... C++: GetStatus() end. C++: SendMsg() C++: Java Message:发个信息给C++. C++: SendMsg() end. C++: GetMsg() C++: GetMsg() end.发现Java的都显示中前面,C/C++的printf输出的都显示中后面。
在C/C++中接由到Java的jstring 时,如果包含汉字,可加上字符转换函数,来将其转为正确的字符集,否则有可能会显示乱码。
MAIL: xcl_168@aliyun.com
BLOG: http://blog.csdn.net/xcl168