c/c++调用java
1. JNI中的调用步骤如下:
|
2. DEMO示例(CSDN不能上传RAR吗?DEMO不会传,会的话告知我下),代码段吧:
//c++实现方式 //jstring <-> char* jstring c2jstring(JNIEnv* env,constchar* pcstr) { int nlength = strlen(pcstr); jclass cString = (env)->FindClass("java/lang/String"); jmethodID mIDStr2Init = (env)->GetMethodID(cString,"<init>", "([BLjava/lang/String;)V"); jbyteArray bytes = (env)->NewByteArray(nlength); (env)->SetByteArrayRegion(bytes, 0, nlength, (jbyte*)pcstr); //set jstring's code jstring encoding = (env)->NewStringUTF("utf-8"); //returnjstring jstring jstr = (jstring)(env)->NewObject(cString, mIDStr2Init, bytes, encoding); return jstr; } char*jstring2c(JNIEnv* env, jstring jstr) { char *pcstrbuf = 0; jclass cString = (env)->FindClass("java/lang/String"); jstring encoding = (env)->NewStringUTF("utf-8"); jmethodID mIDGetBytes = (env)->GetMethodID(clsstring,"getBytes", "(Ljava/lang/String;)[B"); jbyteArray arrbytes = (jbyteArray)(env)->CallObjectMethod(jstr, mIDGetBytes, encoding); jsize arrlen = (env)->GetArrayLength(arrbytes); jbyte* bytes = (env)->GetByteArrayElements(arrbytes, JNI_FALSE); if (arrlen > 0) { pcstrbuf = (char*)malloc(arrlen + 1); memcpy(pcstrbuf, bytes, arrlen); pcstrbuf[arrlen] = 0; } (env)->ReleaseByteArrayElements(arrbytes, bytes, 0); return pcstrbuf; } //jstring <-> wchar_t* jstring js2w(JNIEnv* env, unsigned short* str) { int nlength = wcslen(pwcstr); jchar* bytes = (jchar*)malloc(sizeof(jchar)*(nlength+1)); memcpy(bytes, pwcstr, sizeof(jchar)*nlength); bytes[nlength] = 0; jstring jstr = (env)->NewString(bytes, nlength); free(bytes); return jstr; } unsigned short * w2js(JNIEnv* env, jstring str) { int nlength = (env)->GetStringLength(jstr); unsigned short *pwcstr = (unsigned short *)malloc(sizeof(unsigned short)*(nlength+1)); memset(pwcstr, 0, sizeof(unsigned short)*(nlength+1)); wchar_t *pwcbytes = (unsigned short *)(env)->GetStringChars(jstr, 0); memcpy(pwcstr, pwcbytes, nlength*sizeof(unsigned short)); (env)->ReleaseStringChars(jstr, pwcbytes); return pwcstr; } |