posts - 88, comments - 3, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          用JNI從C傳遞結(jié)構(gòu)體到JAVA

          Posted on 2012-10-12 16:40 Milo的海域 閱讀(3869) 評論(0)  編輯  收藏 所屬分類: JavaLinux
          直接上C的實現(xiàn)
          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;
          }

          對應(yīng)的Java調(diào)用
          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

          主站蜘蛛池模板: 宜章县| 南宁市| 乌海市| 通江县| 辽源市| 黑龙江省| 旬阳县| 长岛县| 兰坪| 吉林市| 边坝县| 乌鲁木齐市| 阿勒泰市| 微博| 固阳县| 闸北区| 泰州市| 漳州市| 全南县| 兴安盟| 临泉县| 巴林右旗| 泰宁县| 乌拉特前旗| 辽阳县| 宁武县| 兰坪| 巫溪县| 泰兴市| 福贡县| 遵义县| 鹤岗市| 富平县| 黄冈市| 高邑县| 梅州市| 博乐市| 漳平市| 荆州市| 青铜峡市| 遂平县|