JINI(1) Java与C/C++的交互(二)

2014-11-24 11:18:52 · 作者: · 浏览: 1
ndMsg (JNIEnv * env, jobject jobj, jstring msg) { printf("C++: SendMsg()\n"); jboolean b = true; char s[80]; memset(s, 0, sizeof(s)); strcpy_s(s ,(char*)env->GetStringUTFChars(msg, &b)); printf("C++: Java Message:%s\n", s); env->ReleaseStringUTFChars(msg , NULL); printf("C++: SendMsg() end.\n"); return 0; }

要注意的地方之一是,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\win32

4. 编译出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)
  


5. 运行结果如下.

__________________________
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