在java編程語言中有非靜態成員函數和靜態成員函數,JNI允許我們訪問到java中的成員函數,然后再jni中調用,這里我就來舉例說明在jni中是如何做到的。 我們先在java中定義2個成員函數,一個非靜態的,一個是靜態的,分別會把title的textView設置成不同的: pu
在java編程語言中有非靜態成員函數和靜態成員函數,JNI允許我們訪問到java中的成員函數,然后再jni中調用,這里我就來舉例說明在jni中是如何做到的。
我們先在java中定義2個成員函數,一個非靜態的,一個是靜態的,分別會把title的textView設置成不同的值:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mContext = this; bt1 = (Button)findViewById(R.id.button1); bt2 = (Button)findViewById(R.id.button2); tv = (TextView)findViewById(R.id.tv); tv.setText(""+si); bt1.setOnClickListener(new MyButtonListener()); bt2.setOnClickListener(new MyButtonListener()); } class MyButtonListener implements OnClickListener{ public void onClick(View v) { if(v.getId() == R.id.button1 ){ accessInstanceMethod("Instance Method Call"); } if(v.getId() == R.id.button2 ){ accessInstanceMethod("Static Method Call"); } } } private void InstanceMethod(String str) { tv.setText(str); } private void static StaticMethod(String str) { tv.setText(str); } public native void accessInstanceMethod(String str); public native void accessStaticMethod(String str);
void Java_com_android_jni_MyJNI_accessInstanceMethod(JNIEnv *env, jobject obj, jstring jstr) { const jbyte *str; str = (*env)->GetStringUTFChars(env,jstr,NULL); if(str == NULL) return ; __android_log_print(ANDROID_LOG_INFO,"-JNI-","%s",str); (*env)->ReleaseStringUTFChars(env,jstr,str); jclass cls = (*env)->GetObjectClass(env,obj); jmethodID mid = (*env)->GetMethodID(env,cls,"InstanceMethod", "(Ljava/lang/String;)V"); if(mid == NULL) return ; (*env)->CallVoidMethod(env,obj,mid,jstr); } void Java_com_android_jni_MyJNI_accessStaticMethod(JNIEnv *env, jobject obj, jstring jstr) { const jbyte *str; str = (*env)->GetStringUTFChars(env,jstr,NULL); if(str == NULL) return; __android_log_print(ANDROID_LOG_INFO,"-JNI-","%s",str); (*env)->ReleaseStringUTFChars(env,jstr,str); jclass cls = (*env)->GetObjectClass(env,obj); jmethodID mid = (*env)->GetStaticMethodID(env,cls,"StaticMethod", "(Ljava/lang/String;)V"); if(mid == NULL) return ; (*env)->CallStaticVoidMethod(env,obj,mid,jstr); }
運行模擬器,點擊不同的按鈕觀察title的textView:
-----------------------------------------------------------------------------------------------------
調用java的method就介紹到這,關于別的返回值的函數大家可以自己去嘗試,用法都是差不多的。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com