用JNI从C传递结构体到JAVA

直接上C的实现
typedef  struct  Foo {
     int  len;
     char  name[100];
Foo_t ;

JNIEXPORT jint JNICALL
Java_TestJNI_foo(JNIEnv *env, jobject obj,  jobject fooObj ) {

     Foo_t * bar  = malloc( sizeof (Foo_t));
    jclass clazz;
    jfieldID fid;

     // init the bar data of C
    strcpy(bar->name, "Yachun Miao");
    bar->len = strlen(bar->name);

     //  mapping bar of C to foo
    clazz = (*env)->GetObjectClass(env, fooObj);
     if  (0 == clazz) {
        printf("GetObjectClass returned 0\n");
         return  (-1);
    }
    fid = (*env)->GetFieldID(env, clazz, "len", "I");
    (*env)->SetLongField(env, fooObj, fid, bar->len);


    fid = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;");
    jstring name = (*env)->NewStringUTF(env, bar->name);
    (*env)->SetObjectField(env, fooObj, fid, name);

    free(bar);
     return  0;
}

对应的Java调用
public class Foo {
    protected int len;
    protected String name;
}



     private   static   native   int  foo( Foo fooObj );

     public   static   void  main(String args[]) {
        System.loadLibrary("mylib");

        Foo foo = new Foo();
        foo(foo);

        System.out.println(foo.name);
        System.out.println(foo.len);

    }

参考链接
http://www.steveolyo.com/JNI/JNI.html#CSTRCJ

http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/types.html



http://blog.csdn.net/vblittleboy/article/details/11763409

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值