Android JNI(四)————JNI_在由C语言编写的JNI本地函数中如何控制Java端的代码

来源:互联网 发布:猿飞菖蒲 知乎 编辑:程序博客网 时间:2024/06/06 08:45

第一步:java端代码

class JniTest {private int intField;public JniTest(int num) {intField = num;System.out.println("[java] JniTest(int num):intField = " + intField);}public int callByNative(int num) {System.out.println("[java] jniTest callByNative(int num)");return num;}public void callTest(){System.out.println("[java] JniTest callTest : intField = " + intField);}}public class JniFuncMain {private static int staticIntField = 300;static {System.loadLibrary("jnifunc");}public static native JniTest createJniObject();public static void main(String args[]) {System.out.println("[java] createJniObject()");JniTest jniObj = createJniObject();jniObj.callTest();}}

第二步:生成函数原型头文件(略)

第三步:C++/C端代码(本例中为C++)

#include <jni.h>#include <stdio.h>#include "JniFuncMain.h"/* * Class:     JniFuncMain * Method:    createJniObject * Signature: ()LJniTest; */JNIEXPORT jobject JNICALL Java_JniFuncMain_createJniObject(JNIEnv *env, jclass clazz){jfieldID fid;jint staticIntField;jclass targetClass;jmethodID mid;jobject newObject;jint result;/*获取JniFuncMain类的staticIntField变量值*/fid = env->GetStaticFieldID(clazz,"staticIntField","I");staticIntField = env->GetStaticIntField(clazz,fid);printf("[cpp] JniFuncMain.staticIntField = %d\n",staticIntField);/* 查找生成对象的类*/targetClass = env->FindClass("JniTest");/*查找构造方法*/mid = env->GetMethodID(targetClass,"<init>","(I)V");/*生成JniTest对象*/printf("[cpp] create JniTest\n");newObject = env->NewObject(targetClass,mid,100);/*调用对象的方法*/mid = env->GetMethodID(targetClass,"callByNative","(I)I");result = env->CallIntMethod(newObject,mid,200);/*设置JniObject 对象的intField值*/fid = env->GetFieldID(targetClass,"intField","I");printf("[cpp] set JniTest intField = 200\n");env->SetIntField(newObject,fid,result);/*返回对象的引用*/return newObject;
}

总结:

一、通过JNI,获取成员变量值

1、查找含有待访问成员变量的JniFuncMain类的jclass值

2、获取staticIntField变量的ID值

fid = env->GetStaticFieldID(clazz,"staticIntField","I");

3、读取jclass与fieldid指定的成员变量的值

staticIntField = env->GetStaticIntField(clazz,fid);

二、生成对象

1、查找生成对象的类

2、查找生成类的构造方法

3、生成JniTest类对象(返回对象引用)

阅读全文
0 0
原创粉丝点击