前言
上一篇文章我们介绍了《Android NDK编程(七)--- JNI中List结构的类数据返回》,这章主要介绍把List结构的类做为参数在方法中进行实现。
实现目标
我们用上一章能过JNI生民的LIst<CProduct>类做为参数,把每个一生成的商品数量加上20。
实现思路
代码实现
首先我们在布局文件里面加入一个新的按钮,用于区分原来生成的那个按钮
然后在VaccaeJNI的类中加入我们的修改产品信息方法
按下ALT+ENTER自动在native-lib.cpp中生成方法
写实现方法,根据上面我们写的实现思路,贴出我们的代码
extern "C"
JNIEXPORT void JNICALL
Java_dem_vac_vaccaendk_VaccaeJNI_setlistproduct(JNIEnv *env, jclass type, jobject list) {
//获取ArrayList类引用
jclass list_jcls = env->FindClass("java/util/ArrayList");
if (list_jcls == NULL) {
LOGI("ArrayList没找到相关类!");
return;
}
//获取ArrayList对象的get()的methodID
jmethodID list_get = env->GetMethodID(list_jcls, "get", "(I)Ljava/lang/Object;");
//获取ArrayList对象的size()的methodID
jmethodID list_size = env->GetMethodID(list_jcls, "size", "()I");
//然后获取我们的CProduct类的class
jclass jcls = env->FindClass("dem/vac/vaccaendk/CProduct");
if (jcls == NULL) {
return;
}
jfieldID qty = env->GetFieldID(jcls, "qty", "I");
int size= env->CallIntMethod(list,list_size);
for (int i = 0; i < size; i++) {
//通过List中的get方法获取到当前的CProduct类
jobject item=env->CallObjectMethod(list,list_get,i);
//获取到原来的数量
int count = env->GetIntField(item,qty);
//在原数量上加上20
env->SetIntField(item, qty, count+20);
}
}
在MainActivity中把按钮2的方法中调用刚才的JNI并显示出数据来
最后我们看一下程序运行后效果
刚打开程序
按下测试按钮后效果
按下测试2的效果
-END-