jni调用复杂数据结构
1.java方面
package com.flaginfo.jni;
import java.util.Arrays;
/**
public class ToundUtils {
static{
System.load("/home/yxtuser/javatest/libt.so");
}
public native DiskInfoHash getDiskInfoHash();
public static void main(String[] args) {
System.out.println("==ToundUtils=");
ToundUtils u = new ToundUtils();
System.out.println("getDiskInfoHash:"+u.getDiskInfoHash().dic);
}
}
package com.flaginfo.jni;
import java.util.ArrayList;
import java.util.HashMap;
public class DiskInfoHash {
public HashMap<String,ArrayList<DiskInfo>> dic;
@Override
public String toString() {
return "DiskInfoHash [dic=" + dic + "]";
}
}
package com.flaginfo.jni;
public class DiskInfo {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "DiskInfo [name=" + name + "]";
}
}
2,c实现
/*
* * Class: com_flaginfo_jni_ToundUtils
* * Method: getDiskInfoHash
* * Signature: ()Lcom/flaginfo/jni/DiskInfoHash;
* */
JNIEXPORT jobject JNICALL Java_com_flaginfo_jni_ToundUtils_getDiskInfoHash
(JNIEnv *env, jobject obj){
//new DiskInfoHash对象
jclass disk_hash_jcz=(*env)->FindClass(env,"Lcom/flaginfo/jni/DiskInfoHash;");
jmethodID disk_hash_intmed=(*env)->GetMethodID(env,disk_hash_jcz,"<init>","()V");
jobject disk_hash_obj = (*env)->NewObject(env,disk_hash_jcz,disk_hash_intmed);
jfieldID disk_hash_field_dic=(*env)->GetFieldID(env,disk_hash_jcz,"dic","Ljava/util/HashMap;");
//new Hash对象
jclass hash_jcz=(*env)->FindClass(env,"Ljava/util/HashMap;");
jmethodID hash_intmed=(*env)->GetMethodID(env,hash_jcz,"<init>","()V");
jobject hash_obj = (*env)->NewObject(env,hash_jcz,hash_intmed);
jmethodID hash_method_put=(*env)->GetMethodID(env,hash_jcz,"put","(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
//new list对象
jclass list_jcz=(*env)->FindClass(env,"Ljava/util/ArrayList;");
jmethodID list_intmed=(*env)->GetMethodID(env,list_jcz,"<init>","()V");
jobject list_obj = (*env)->NewObject(env,list_jcz,list_intmed);
jmethodID list_method_add=(*env)->GetMethodID(env,list_jcz,"add","(Ljava/lang/Object;)Z");
//new DiskInfo对象
jclass disk_jcz=(*env)->FindClass(env,"Lcom/flaginfo/jni/DiskInfo;");
jmethodID disk_intmed=(*env)->GetMethodID(env,disk_jcz,"<init>","()V");
jobject disk_obj = (*env)->NewObject(env,disk_jcz,disk_intmed);
jfieldID disk_field_name=(*env)->GetFieldID(env,disk_jcz,"name","Ljava/lang/String;");
jstring str;
str=(*env)->NewStringUTF(env,"牙科");
(*env)->SetObjectField(env,disk_obj,disk_field_name,str);
(*env)->CallBooleanMethod(env,list_obj,list_method_add,disk_obj);
str=(*env)->NewStringUTF(env,"科室");
(*env)->CallObjectMethod(env,hash_obj,hash_method_put,str,list_obj);
(*env)->SetObjectField(env,disk_hash_obj,disk_hash_field_dic,hash_obj);
//删除局部引用
(*env)->DeleteLocalRef(env,disk_obj);
(*env)->DeleteLocalRef(env,list_obj);
(*env)->DeleteLocalRef(env,hash_obj);
return disk_hash_obj;
}
3.编译
makefile
libt.so:com_flaginfo_jni_ToundUtils.o
gcc -shared com_flaginfo_jni_ToundUtils.o -o libt.so
com_flaginfo_jni_ToundUtils.o:com_flaginfo_jni_ToundUtils.c
gcc -fPIC -D_REENTRANT -I/usr/java/jdk1.8.0_102/include -I/usr/java/jdk1.8.0_102/include/linux -c com_flaginfo_jni_ToundUtils.c
clean:
rm -rf libt.so
rm -rf com_flaginfo_jni_ToundUtils.o
~
~
~
~
~
~
~
~
~
~4.ok
测试