第一步: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类对象(返回对象引用)