JNI返回类型

时间:2012-04-03 17:30:58

标签: java c java-native-interface

我可以使用返回指针的本机方法吗? 我使用以下语法: public native int* intArrayMethod(float[] t,int nb_of_subscribers,int tags); 但它表示错误。

1 个答案:

答案 0 :(得分:2)

由于C ++和Java之间的数据结构存在差异,因此不应在Java中使用本机指针。和Java的垃圾收集器。

您的Java类应如下所示:

    public class IntArrayViaJNI {
      private static boolean loaded = false;
      private native int[] intArrayMethod(float[] t, int nb_of_subscribers, int tags);

      public int[] getIntArray(float[] t, int nb_of_subscribers, int tags) {
          // Although this portion should be in a synchronized method,
          // e.g. ensureLibraryLoaded().
          if (!loaded) {
            System.loadLibrary("mylib");
            loaded = true;
          }
          return intArrayMethod(t, nb_of_subscribers, tags);
      }
    }

您的C ++代码应如下所示:

    JNIEXPORT jintArray JNICALL Java_IntArrayViaJNI_intArrayMethod(
        JNIEnv *env, jclass cls,
        /* generated by JAVAH: float[] t, int nb_of_subscribers, int tags */)
    {
      jintArray result = (*env)->NewIntArray(env, size);
      if (result == NULL) {
        return NULL; /* out of memory error thrown */
      }
      int i, size = MY_ARRAY_SIZE;

      // Populate a temp array with primitives.
      jint fill[256];
      for (i = 0; i < size; i++) {
        fill[i] = MY_ARRAY_VALUE;
      }

      // Let the JVM copy it to the Java structure.
      (*env)->SetIntArrayRegion(env, result, 0, size, fill);
      return result;
    }