jni调用

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

测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值