学习android JNI的那些事儿--------5. Field & Method --&g
在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);
我们再来看下jni中是如何处理的:
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); }
这边都比较简单,先是找到class,然后得到method ID,之后是根据method ID调用JAVA中的function
运行模拟器,点击不同的按钮观察title的textView:
-----------------------------------------------------------------------------------------------------
调用java的method就介绍到这,关于别的返回值的函数大家可以自己去尝试,用法都是差不多的。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

新報告對傳聞中的三星 Galaxy S25、Galaxy S25 Plus 和 Galaxy S25 Ultra 相機升級進行了嚴厲的評估

三星 Galaxy S25 Ultra 洩漏了第一張渲染圖,傳聞中的設計變化被曝光

IFA 2024 | TCL 的 NXTPAPER 14 在性能上無法與 Galaxy Tab S10 Ultra 相媲美,但在尺寸上幾乎可以與之媲美

Vivo Y300 Pro 在 7.69 毫米纖薄機身中配備 6,500 mAh 電池

新報告對傳聞中的三星 Galaxy S25、Galaxy S25 Plus 和 Galaxy S25 Ultra 相機升級進行了嚴厲的評估

三星 Galaxy S24 FE 預計將以低於預期的價格推出,有四種顏色和兩種記憶體選項

小米紅米 Note 14 Pro Plus 上市,成為首款配備 Light Hunter 800 相機的高通 Snapdragon 7s Gen 3 智慧型手機
