android jni (5)——Field & Method --> Accessing Mehtod
在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就介绍到这,关于别的返回值的函数大家可以自己去尝试,用法都是差不多的。
android jni (5)——Field & Method --> Accessing Mehtod的更多相关文章
- android JNI (二) 第一个 android工程
下载NDK 后 它自带有 sample,初学者 可以导入Eclipse 运行 这里 我是自己创建的一个新工程 第一步: 新建一个Android工程 jni_test(名字自取) 第二步:为工程添加 本 ...
- 【转】android 电池(三):android电池系统
关键词:android电池系统电池系统架构 uevent power_supply驱动 平台信息: 内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV3 ...
- 安卓开发_浅谈Android动画(四)
Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1. ValueAnimator 基本属 ...
- 【转】android Graphics(四):canvas变换与操作
android Graphics(四):canvas变换与操作 分类: 5.andriod开发2014-09-05 15:05 5877人阅读 评论(18) 收藏 举报 目录(?)[+] 前言 ...
- android安全问题(八)伪造短信(利用原生android4.0漏洞)
导读:本文利用android4.0的一个原生漏洞来伪造短信.无须声明任何权限即可伪造发送方为任何号码的短信给用户. android4.0发布已经是很久很久很久很久以前的事情了,这个漏洞早就报了出来,之 ...
- android Graphics(四):canvas变换与操作
前言:前几篇讲解了有关canvas绘图的一些操作,今天更深入一些,讲讲对画布的操作,这篇文章不像前几篇那么容易理解,如果以前没有接触过画布的童鞋可能比较难以理解,为什么会这样.我尽量多画图,让大家更清 ...
- android Graphics(三):区域(Range)
前言:最近几天对画图的研究有些缓慢,项目开始写代码了,只能在晚上空闲的时候捯饬一下自己的东西,今天给大家讲讲区域的相关知识,已经想好后面两篇的内容了,这几天有时间赶紧写出来给大家.有关界面开发的东东内 ...
- android Graphics(一):概述及基本几何图形绘制
前言:我最近想抽空研究研究android的各种特效,android的特效真是其它平台无法比拟的,而且一个漂亮的UI交互,会给APP增色不少,而学习特效之前,有关graphics绘图的基础知识是必不可少 ...
- android - 自定义(组合)控件 + 自定义控件外观
转载:http://www.cnblogs.com/bill-joy/archive/2012/04/26/2471831.html android - 自定义(组合)控件 + 自定义控件外观 A ...
随机推荐
- Perl 多线程模块 Parallel::ForkManager
Perl 多线程模块 Parallel::ForkManager 一个简单的并行处理模块.这个是用来对付循环的多线程处理. 放在循环前面. Table of Contents 1 Synops内容简介 ...
- sybase从表A创建表B
sybase从表A创建表B 例如:需要创建一张表B,表的内容及结构跟表A完全一样,类似于SQL SERVER中的CREATE TABLE A AS SELECT * FROM B; 在sybase中只 ...
- _js day9
- iOS中如何获取image.xcassets中的启动图片
/** * 获取启动图片 */ +(UIImage *)launchImage{ NSString *imageName=@"LaunchImage-700"; if(iphon ...
- python - 类的字段
一.静态字段:保存在类里面 1.创建静态字段: class Foo: CC = 123 # 字段(静态字段),保存在类里 def __init__(self): self.name = 'alex' ...
- gstreamer让playbin能够播放rtp over udp流数据
最近一段时间在研究传屏低延迟传输相关的一些东西.本来想使用gstreamer来验证下rtp over udp传送h264 nal数据相关 的,结果发现竟然不能用playbin来播放rtp的数据!诚然, ...
- SQL中@@ROWCOUNT函数
返回受上一语句影响的行数.如果行数大于 20 亿,请使用 ROWCOUNT_BIG. 语法 @@ROWCOUNT 返回类型 int 注释 Transact-SQL 语句可以通过下列方 ...
- SuperSocket学习笔记(二)
上一篇博客SuperSocket学习笔记(一)说明了怎么快速搭建一个服务器端,这篇文章我想深挖一下SuperSocket 1. 每一个客户端连接到服务器端时,服务器端会将客户端的信息保存到一个Sess ...
- SpinLock(自旋锁)
SpinLock(自旋锁) SpinLock 结构是一个低级别的互斥同步基元,它在等待获取锁时进行旋转. 在多核计算机上,当等待时间预计较短且极少出现争用情况时,SpinLock 的性能将高于其他类型 ...
- 《第一行代码》学习笔记28-内容提供器Content Provider(1)
1.内容提供器:用于在不同的应用程序之间实现数据共享的功能,提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问 数据的安全性.使用内容提供器是Android实现跨程序共享数据 ...