学习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)

最近几天,Ice Universe 不断披露有关 Galaxy S25 Ultra 的详细信息,人们普遍认为这款手机将是三星的下一款旗舰智能手机。除此之外,泄密者声称三星只计划升级一款相机

OnLeaks 现在与 Android Headlines 合作,首次展示了 Galaxy S25 Ultra,几天前,他试图从他的 X(以前的 Twitter)粉丝那里筹集到 4,000 美元以上的资金,但失败了。对于上下文,嵌入在 h 下面的渲染图像

除了发布两款新智能手机外,TCL 还发布了一款名为 NXTPAPER 14 的新 Android 平板电脑,其大屏幕尺寸是其卖点之一。 NXTPAPER 14 采用 TCL 标志性品牌哑光液晶面板 3.0 版本

最近几天,Ice Universe 不断披露有关 Galaxy S25 Ultra 的详细信息,人们普遍认为这款手机将是三星的下一款旗舰智能手机。除此之外,泄密者声称三星只计划升级一款相机

Vivo Y300 Pro刚刚全面亮相,它是最薄的中端Android手机之一,配备大电池。准确来说,这款智能手机的厚度仅为 7.69 毫米,但配备了 6,500 mAh 的电池。这与最近推出的容量相同

摩托罗拉今年发布了无数设备,尽管其中只有两款是可折叠的。就上下文而言,虽然世界上大多数地区都收到了 Razr 50 和 Razr 50 Ultra,但摩托罗拉在北美提供了 Razr 2024 和 Razr 2

Redmi Note 14 Pro Plus 现已正式成为去年 Redmi Note 13 Pro Plus 的直接后继产品(亚马逊售价 375 美元)。正如预期的那样,Redmi Note 14 Pro Plus与Redmi Note 14和Redmi Note 14 Pro一起成为Redmi Note 14系列的主角。李

三星尚未就何时更新其 Fan Edition (FE) 智能手机系列提供任何提示。目前来看,Galaxy S23 FE 仍然是该公司的最新版本,于 2023 年 10 月年初推出。
