用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

你可能感兴趣的:(用JNI从C传递结构体到JAVA)