例:

在Java中定义一个属性,然后用C语言将其设置成另外的值,并输出出来。

Java代码:

Person.java

package com.yuneec.demo;

public class Person {

    static {
System.loadLibrary("td");
} public int age = 20; public native void readAge(); public int getAge() {
return age;
} }

MainActivity.java

package com.yongdaimi.android.framework;

import com.yuneec.demo.Person;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ private Button bt_test;
private Person person; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_test = (Button) findViewById(R.id.bt_test);
bt_test.setOnClickListener(this);
person = new Person();
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_test:
// called by native
person.readAge();
// called by java
int java_age = person.getAge();
Log.i("xp.chen", "java_age is: "+java_age);
break;
default:
break;
}
} }

C代码;

test_jni.c

#ifdef __ANDROID__

#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include "jnihelp.h" #define LOG_TAG "xp.chen" #ifdef LOG_TAG
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#else
#define LOGE(...)
#endif JNIEXPORT void com_yuneec_demo_Person_readAge(JNIEnv *env, jobject obj)
{
//获致obj中对象的class
jclass clazz = (*env)->GetObjectClass(env, obj);
// 获取java中age字段的ID(最后一个参数是age的签名)
jfieldID id_age = (*env)->GetFieldID(env, clazz, "age", "I");
// 获取age字段对应的值
jint age = (*env)->GetIntField(env, obj, id_age);
// 输出
// printf("current age is: %d\n", number);
LOGE("native-age is: %d\n", age);
// 重新修改age字段的值为100。
(*env)->SetIntField(env, obj, id_age, );
} static JNINativeMethod methods[] = {
{"readAge","()V",(void*)com_yuneec_demo_Person_readAge},
}; static const char *classPathName = "com/yuneec/demo/Person"; static int registerNativeMethods(JNIEnv* env, const char* className,JNINativeMethod* gMethods, int numMethods)
{
jclass clazz; clazz = (*env)->FindClass(env, className);
if (clazz == NULL){
return JNI_FALSE;
} if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < )
{
return JNI_FALSE;
} return JNI_TRUE;
} void JNI_OnUnload(JavaVM* vm, void* reserved)
{
return;
} jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv *env;
if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
return -;
}
if (JNI_TRUE != registerNativeMethods(env, classPathName,methods, sizeof(methods) / sizeof(methods[])))
{
return -;
}
return JNI_VERSION_1_4;
}
#endif

编译成功后,在eclipse中的运行结果为:

第一个是在C代码中读取到的Java中成员变量age的值。

第二个是在Java代码中读取到成员变量的值(在Native层作了修改)。

JNI-获取Java对象的成员变量-GeInttField()的更多相关文章

  1. java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。

    //------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...

  2. Java学习日记基础篇(四)——类,对象之成员变量,成员方法,构造方法

    面向对象(Object Oriented) 一.面向对象杂谈 面向对象(Object Oriented),我的翻译是以物体为目标的,就是说编程的时候是建立一个物体,然后对这个物体进行操作. Java语 ...

  3. Java 访问限制符 在同一包中或在不同包中:使用类创建对象的权限 & 对象访问成员变量与方法的权限 & 继承的权限 & 深入理解protected权限

    一.实例成员与类成员 1. 当类的字节码被加载到内存, 类中类变量.类方法即被分配了相应内存空间.入口地址(所有对象共享). 2. 当该类创建对象后,类中实例变量被分配内存(不同对象的实例变量互不相同 ...

  4. JAVA基础系列:内部类获取外部类的成员变量

    内部类获取外部类的成员变量,使用 外部类类名.this.变量名 的形式获取 public class Outer { public String name = "outer"; c ...

  5. Java学习笔记十五:Java中的成员变量和局部变量

    Java中的成员变量和局部变量 一:成员变量: 成员变量在类中定义,用来描述对象将要有什么 成员变量可以被本类的方法使用,也可以被其他类的方法使用,成员变量的作用域在整个类内部都是可见的 二:局部变量 ...

  6. JavaSE---类、对象、成员变量、局部变量

    1.概述 1.1 类 1.1.1 类   是一种  自定义的  引用  数据类型: 1.2 对象 1.2.1 创建对象的根本途径:构造器: 通过new关键字   来调用  某个类的构造器: packa ...

  7. java中的成员变量和局部变量区别

    1.作用域不同 成员变量的作用域在整个类内部都是可见,可用的: 局部变量的作用域仅限于定义它的方法,不能被其它方法调用: 2.初始值不同 java会给成员变量一个初始值,初始值为0: java不会给局 ...

  8. 获取JAVA对象占用的内存大小

    介绍两种获取JAVA对象内存大小的方法. 第一种:Instrumentation 简介: 使用java.lang.instrument 的Instrumentation来获取一个对象的内存大小.利用I ...

  9. EL语法 ${person.id} 这里面的id指的是实例对象的成员变量

    EL语法 ${person.id} 这里面的id指的是实例对象的成员变量

随机推荐

  1. PHP採集利器:依据開始字符串和结束字符串截取须要的採集内容数据

    PHP採集利器:依据開始字符串和结束字符串截取须要的採集内容数据 function strCutByStr(&$str, $findStart, $findEnd = false, $enco ...

  2. python3安装Beautiful Soup爬虫组件

    第一步:下载beautifulsoup4-4.3.2.tar.gz 第二步:拷贝解压缩目录到C:\Python34\beautifulsoup4-4.3.2 第三步: 第四步: 第五步:拷贝C:\Py ...

  3. SAP SQ01怎样从开发机传输到生产机

    确认你的Query是本地的还是全局的(跨Client).假设是后者,会自己主动生成传输请求,用标准传输方式就可以. 假设是本地的Query,有两种方式: 方式1:复制成全局的,让后生成传输请求 方式2 ...

  4. 在OpenERP8.0中如何激活及时通讯功能im

    How to activate chat (im) in v8 (trunk) I know its already answered that chat (im) is only available ...

  5. CentOS 查看系统版本号

    查看centos版本: cat /etc/issuecat /etc/redhat-release 查看系统位数: getconf LONG_BIT 查看内核版本: uname -r cat /pro ...

  6. scala class和object,trait的区别

    Scala类 1 2 3 4 5 6 7 8 9 10 11 12 13 class Counter {   private var value = 0 // 必须初始化字段   def increm ...

  7. Linux ssh服务开启秘钥和密码认证

    问题描述: 实现Linux秘钥和密码同时认证 解决方案: vim /etc/ssh/sshd_config 基本参数: PermitRootLogin yes #允许root认证登录 Password ...

  8. Linux文件大小排序

    ls 文件详情 ls   -S /            ###从大到小排序ls   -Sr /          ###从小到大排就加个-r     -r 翻转ls   -aSr /         ...

  9. 小程序九:导航&地图&画布

    navigator 导航 属性名 类型 默认值 说明 url String   应用内的跳转链接 redirect Boolean false 是否关闭当前页面 hover-class String ...

  10. Spring MVC request flow

    1. When we enter a URL in the browser, the request comes to the dispatcher servlet.The dispatcher se ...