转自:http://blog.csdn.net/geolo/article/details/6168313


转自:http://www.android123.com.cn/androidkaifa/686.html

(1 String类型的属性读写

class AndroidJniDemo2 {
private String sTmp;
private native void readwriteField();
public static void main(String args[]) {
AndroidJniDemo2 ajd2 = new AndroidJniDemo2();
ajd2.sTmp = "cwj";
ajd2.readwriteField();
System.out.println("Java cwj print ="+ajd2.sTmp); //java层打印结果

}
static {
System.loadLibrary("AndroidJniDemo2");
}
}

下面是JNI层代码:

JNIEXPORT void JNICALL
Java_AndroidJniDemo2_readwriteField(JNIEnv *env, jobject obj)
{
jfieldID fid;
jstring jstr;
const char *szTemp;

jclass clazz = (*env)->GetObjectClass(env, obj);

fid = (*env)->GetFieldID(env, clazz, "sTmp", "Ljava/lang/String;"); // 注意sTmp是Java中声明的,String类型在java.lang.String包中,签名符号的格式注意
if (fid == NULL) {
return;
}

jstr = (*env)->GetObjectField(env, obj, fid); //Java的String类型,要用GetObjectField函数获取,这里Android123提示大家没有GetStringField这样的函数在JNI中,或者说在C语言中
szTemp = (*env)->GetStringUTFChars(env, jstr, NULL); //因为还需要赋值,在C中我们转换为utf8的类型。
if (szTemp == NULL) {
return;
}

printf("JNI cwj print=%s", szTemp); //先打印Java层传进来的值

(*env)->ReleaseStringUTFChars(env, jstr, szTemp); //szTemp打印完不用了要及时释放掉

jstr = (*env)->NewStringUTF(env, "android123"); //返新的字段值,供Java层打印
if (jstr == NULL) {
return;
}
(*env)->SetObjectField(env, obj, fid, jstr); //设置新的属性值。
}

(2 int或double类似的类型的属性读写,本例同时属性值是一个静态的定义,注意下面加粗的static关键字

class AndroidJniDemo3 {
privatestaticint sAge;
private native void readwriteField();
public static void main(String args[]) {
AndroidJniDemo3 ajd3 = new AndroidJniDemo3();
AndroidJniDemo3.sAge = 23;
ajd3.readwriteField(); //执行jni层
System.out.println("Java cwj print="+sAge); //java层打印新的值,应该为120
}
static {
System.loadLibrary("AndroidJniDemo3");
}
}

JNIEXPORT void JNICALL
Java_AndroidJniDemo3_readwriteField(JNIEnv *env, jobject obj)
{
jfieldID fid;
jint nTemp;

jclass clazz = (*env)->GetObjectClass(env, obj);

fid = (*env)->GetStaticFieldID(env, clazz, "sAge", "I"); //因为是整形,这里签名符号为I,注意使用的函数中包含Static代表是一个静态的属性
if (fid == NULL) {
return;
}

nTemp = (*env)->GetStaticIntField(env, clazz, fid);
printf("JNI cwj print=%d", nTemp); //这里应该显示23
(*env)->SetStaticIntField(env, clazz, fid, 120); //设置新的值为120,注意包含了Static,java层中定义的sAge是静态的。
}



更多相关文章

  1. Nginx系列教程(四)| 一文带你读懂Nginx的动静分离
  2. 【Android(安卓)开发教程】链接Activities
  3. 在命令行中通过adb shell am broadcast发送广播通知
  4. UI-TextView省略号
  5. Android(安卓)windowSoftInputMode属性
  6. Android四大组件之BroadCast
  7. LinearLayout中添加分割线
  8. CoordinatorLayout 的使用
  9. android 全透明式状态栏

随机推荐

  1. android 使用mediaplayer播放报java.io.I
  2. 详解Android数据存储―使用SQLite数据库
  3. android 控件 单项选择(RadioGroup,Radio
  4. Unable to find method 'org.gradle.api.
  5. Android(安卓)Studio 在run时报的异常 Fa
  6. Android之external部分目录功能说明整理
  7. Android中GC_EXTERNAL_ALLOC的含义小结
  8. listview 常用智识总结
  9. android百度地图定位显示当前位置(androi
  10. x86平台下 Android(安卓)系统的 Linux 部