前言
代码往往在不断写的情况下学习到新的东西,本以为NDK程序这块出完番外篇后应该就不用再出了,结果在使用过程中还是会有新的东西加入,所以又有了今天这一篇。
JNI中类的传递
上面说了一大篇,正篇我们马上开始。
首先创建我们要传递的类
public class CProduct {
public CProduct() {
incode="";
fname="";
price=0;
qty=0;
}
//商品编码
public String incode;
//商品名称
public String fname;
//价格
public float price;
//数量
public int qty;
}
从JNI中得到返回类的信息
我们在VaccaeJNI的类中加入一个静态方法getproduct;
//获取产品信息
public native static CProduct getproduct();
然后按ALT+ENTER让其在native-lib.cpp中自动生成对应的方法
生成返回类的步骤:
extern "C"
JNIEXPORT jobject JNICALL
Java_dem_vac_vaccaendk_VaccaeJNI_getproduct(JNIEnv *env, jclass type) {
//首先获取class
jclass jcls = env->FindClass("dem/vac/vaccaendk/CProduct");
if (jcls == NULL) {
return 0;
}
//定义类里面的属性
jfieldID incode = env->GetFieldID(jcls, "incode", "Ljava/lang/String;");
jfieldID fname = env->GetFieldID(jcls, "fname", "Ljava/lang/String;");
jfieldID price = env->GetFieldID(jcls, "price", "F");
jfieldID qty = env->GetFieldID(jcls, "qty", "I");
//首先实例化类
jobject jobj = env->AllocObject(jcls);
//然后对类中的各属性赋值
//商品编码
env->SetObjectField(jobj, incode, env->NewStringUTF("000001"));
//商品名称
env->SetObjectField(jobj, fname, env->NewStringUTF("康师傅方便面"));
//价格
env->SetFloatField(jobj, price, 6.5);
//数量
env->SetIntField(jobj, qty, 10);
//输出
return jobj;
}
然后我们在按钮事件里面写入调用的这个方法并显示出来
看一下运行效果
将类做为参数进行修改
首先增加参数
然后还是按ALT+ENTER生成JNI中的方法
操作步骤:
从上面的步骤我们看到,比刚才直接生成类少了一步,这是因为我们参数传递进来的已经有CProduct这个类了,不需要再实例化。
extern "C"
JNIEXPORT jobject JNICALL
Java_dem_vac_vaccaendk_VaccaeJNI_updateproduct(JNIEnv *env, jclass type, jobject prd) {
//首先获取class
jclass jcls = env->FindClass("dem/vac/vaccaendk/CProduct");
if (jcls == NULL) {
return 0;
}
//定义类里面的属性
jfieldID incode = env->GetFieldID(jcls, "incode", "Ljava/lang/String;");
jfieldID fname = env->GetFieldID(jcls, "fname", "Ljava/lang/String;");
jfieldID price = env->GetFieldID(jcls, "price", "F");
jfieldID qty = env->GetFieldID(jcls, "qty", "I");
//然后对类中的各属性赋值
//商品编码
env->SetObjectField(prd, incode, env->NewStringUTF("000002"));
//商品名称
env->SetObjectField(prd, fname, env->NewStringUTF("康师傅冰红茶"));
//价格
env->SetFloatField(prd, price, 4.7);
//数量
env->SetIntField(prd, qty, 15);
//输出
return prd;
}
然后在按钮事件中加入调用这个的代码
最后我们再看一下显示结果
-END-