锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
2錛?span style="FONT: 7pt 'Times New Roman'">聽聽聽聽 瑕佷嬌鐢?/span>JNI錛岄渶瑕侊細
1)錛屽湪Java婧愮▼搴忎腑浣跨敤native鍏抽敭瀛楀0鏄庝竴涓柟娉曘?/span>
聽聽聽聽聽聽聽聽 濡傦細public native void callCppFunction();
2錛夛紝鐒跺悗鍦ㄥ懡浠よ鎻愮ず絎︿笅浣跨敤javah榪欎釜鍛戒護鏉ョ敓鎴愬叧浜?/span>JNI鐨勬湰鍦板ご鏂囦歡銆?/span>
濡傦細javah test.jni.MainArrayTest
聽聽聽聽聽聽聽聽 3錛夛紝鍦?/span>VC Studio涓緩绔嬩竴涓?/span>DLL宸ョ▼錛屾嫹璐濊繖涓ご鏂囦歡鍒拌宸ョ▼鐩綍涓嬶紝鎷瘋礉
聽聽聽聽聽聽聽聽 %JAVA_HOME%"include涓嬮潰鐨?/span>jni.h銆?/span>jni_md.h鍒板伐紼嬬洰褰曚笅錛屾垨鑰呭姞鍒扮郴緇熺洰涓嬶紝鍏蜂綋闇瑕佹嫹璐濈殑澶存枃浠惰繕瑕佸叿浣撶爺絀躲?/span>
4錛夛紝寤轟竴涓?/span>cpp婧愭枃浠訛紝瀹炵幇鐢熸垚鐨勫ご鏂囦歡涓0鏄庣殑鍑芥暟銆?/span>
5錛夛紝鍏蜂綋鍚勭鍑芥暟鍙婃暟鎹被鍨嬬殑浣跨敤濡備笅錛氬叿浣撹嚜宸辯爺絀訛細
l聽聽聽聽聽聽 綆鍗曟柟娉曡皟鐢紝鍩烘湰鏁版嵁綾誨瀷鐨勪嬌鐢?/span>
jclass clazz_TestNative = env->GetObjectClass(obj);
/*聽聽聽聽聽聽
jfieldID id_number = env->GetFieldID(clazz_TestNative,
聽聽聽聽聽聽聽聽聽聽 "number", "I");
jint number = env->GetIntField(obj, id_number);
cout<<number<<endl;
env->SetIntField(obj, id_number, 1000L);
*/
//聽聽聽聽聽聽聽 jmethodID id_max = env->GetMethodID(clazz_TestNative, "max", "(DD)D");
//聽聽聽聽聽聽聽 jdouble maxValue = env->CallDoubleMethod(obj, id_max, 3.14, 3.15);
//聽聽聽聽聽聽聽 cout<<maxValue<<endl;
jfieldID id_person = env->GetFieldID(clazz_TestNative, "person", "Ltest/jni/Father;");
jobject person = env->GetObjectField(obj, id_person);
jclass clazz_Father = env->FindClass("test/jni/Father");
jmethodID id_Father_Function = env->GetMethodID(clazz_Father, "function", "()V");
env->CallVoidMethod(person, id_Father_Function);
env->CallNonvirtualObjectMethod(person,clazz_Father, id_Father_Function);
l聽聽聽聽聽聽 瀵硅薄鐨勪嬌鐢?/span>
jclass clazz_date = env->FindClass("java/util/Date");
jmethodID outputDate_ID = env->GetMethodID(clazz_date, "<init>", "()V");
jobject date_obj = env->NewObject(clazz_date, outputDate_ID);
jmethodID mid_date_getTime = env->GetMethodID(clazz_date, "getTime", "()J");
unsigned times = env->CallLongMethod(date_obj, mid_date_getTime);
//聽聽聽聽聽聽聽 printf("%u",times);
cout<<times<<endl;
l聽聽聽聽聽聽 瀛楃涓茬殑綆鍗曞疄鐢?/span>
jfieldID fid_msg = env->GetFieldID(env->GetObjectClass(obj), "message", "Ljava/lang/String;");
jstring j_msg = (jstring)env->GetObjectField(obj, fid_msg);
//const jchar *p_jst = env->GetStringChars(j_msg, NULL);
//MessageBoxW(NULL,(const wchar_t *)p_jst, L"Title", MB_OK);
jint len = env->GetStringLength(j_msg);
jchar *j_buf = new jchar[len+1];
j_buf[len] = L'"0';
env->GetStringRegion(j_msg, 0, len, j_buf);聽聽聽聽聽聽
wstring wstr((const wchar_t *)j_buf);
//env->ReleaseStringChars(j_msg, j_buf);//涓嶈兘閲婃斁瀛楃鏁扮粍鍟?/span>
delete []j_buf;
std::reverse(wstr.begin(), wstr.end());
jstring jnewStr = env->NewString((const jchar*)wstr.c_str(), wstr.size());
env->SetObjectField(obj, fid_msg, jnewStr);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
l聽聽聽聽聽聽 鏁扮粍鐨勪嬌鐢?/span>
jfieldID fid_arrays = env->GetFieldID(env->GetObjectClass(obj), "arrays", "[I");
jintArray jint_arr = (jintArray)env->GetObjectField(obj, fid_arrays);
jint *int_arr = env->GetIntArrayElements(jint_arr, NULL);
jsize len = env->GetArrayLength(jint_arr);
for(int i = 0; i < len; ++i)
{
//聽聽聽聽聽聽 cout<<int_arr[i]<<endl;
}
sort(int_arr, int_arr + len, less_second);
env->ReleaseIntArrayElements(jint_arr, int_arr, /*JNI_ABORT/JNI_COMMIT/0*/0);
}
bool less_second(const int & m1, const int & m2)
{
聽聽聽聽聽聽聽 return m1 > m2;
}
涓婇潰瑕佹敞鎰忓湪JNI涓Java涓暟鎹被鍨嬬殑鏄犲皠錛岃澶存枃浠剁殑澹版槑銆?/span>
榪樻湁娉ㄦ剰Java涓叧浜庡璞$被鍨嬬殑琛ㄧず鏂規硶姣斿錛?/span>int I, boolean Z,
Object L<綾葷殑瀹屾暣鍚嶇О錛屾敞鎰忓寘鍚嶄互/鍒嗛殧>;錛屾暟緇?/span>[<鏁版嵁綾誨瀷>銆?/span>
濡傛灉涓嶇煡閬撳彲浠ヤ嬌鐢?/span>javap榪欎釜鍙嶇紪璇戝櫒銆?/span>
聽聽聽聽聽聽聽聽
聽聽聽聽聽聽聽聽 6錛夈佹洿澶氳祫鏂欙紝灝?/span>Java鎵嬪唽銆?/span>
聽聽聽聽聽聽聽聽 7錛夈佺紪璇戯紝鐢熸垚DLL銆傚皢DLL鐨勬枃浠惰礬寰勫姞鍒?/span>Path鐜鍙橀噺涓嬶細
聽聽聽聽聽聽聽聽 8錛夈佸湪Main鍑芥暟涓姞杞藉姩鎬佸簱銆?/span>
濡傦細System.loadLibrary("TestNative4")錛屾敞鎰忎笉瑕?/span>DLL鎵╁睍鍚嶏紝涓轟簡璺ㄥ鉤鍙板槢錛?/span>
9錛夈佸鏋滀嬌鐢ㄧ殑鏄?/span>eclipse涔嬬被鐨?/span>IDE宸ュ叿錛岃閲嶅惎錛屽洜涓鴻綾誨伐鍏峰湪鍚姩鏃訛紝榛樿璇誨彇浜嗙郴緇熷彉閲忥紝浣嗘槸涓嶄細鐩戣鍙橀噺鐨勫彉鍖栥?/span>
10錛夈佹敞鎰忓湪JNI涓Java瀵硅薄鐨勫紩鐢ㄣ備笉鐒跺瀮鍦懼洖鏀跺皢浼氫駭鐢熼棶棰樸傛敞鎰忓叏灞寮曠敤錛屽眬閮ㄥ紩鐢ㄣ佸急鍏ㄥ眬寮曠敤鐨勪嬌鐢ㄣ?/span>
聽聽聽聽聽聽聽聽聽聽 灞閮ㄥ紩鐢紝涔熷氨鏄湰鍦版柟娉曚腑榪斿洖寮曠敤銆傚簲璇ヤ嬌鐢?/span>DeleteLocalRef閲婃斁璇ュ紩鐢ㄣ?/span>NewLocalRef鍒涘緩銆傝繕鐢ㄥ緢澶氭柟寮忓垱寤恒?/span>
聽聽聽聽聽聽聽聽聽聽 鍏ㄥ眬寮曠敤錛岄渶瑕佹墜鍔ㄩ噴鏀撅紝闃叉鍨冨溇鍥炴敹鍣ㄥ洖鏀躲傞渶瑕佷嬌鐢?/span>NewGlobalRef鍑芥暟鍒涘緩錛岄噴鏀懼畠闇瑕佷嬌鐢?/span>DeleteGlobalRef鍑芥暟銆?/span>
聽聽聽聽聽聽聽聽聽聽 寮卞叏灞寮曠敤錛岄渶瑕佺紪紼嬩漢鍛樻墜鍔ㄩ噴鏀撅紝浣嗘槸瀹冧笉闃叉鍨冨溇鍥炴敹鍣ㄧ殑鍥炴敹銆?/span>
聽聽聽聽聽聽聽聽聽聽 浣跨敤NewWeakGlobalRef鍒涘緩錛屼嬌鐢?/span>DeleteWeakGlobalref閲婃斁銆?/span>IsSamObject(jobject obj1, jobject obj2)鍒ゆ柇寮卞叏灞寮曠敤鎸囧悜鐨勫璞℃槸鍚﹀凡琚洖鏀躲?/span>