将Jni Type转换为Native类型的正确方法

时间:2017-11-26 13:04:13

标签: java android android-ndk java-native-interface jnienv

我在本机库中定义了以下函数

JNIEXPORT jshortArray JNICALL
Java_net_example_android_library_audio_AudioFilter_process(
        JNIEnv *env, jobject instance, jshortArray readBuffer_) {

如您所见,我正在通过jshortarray

我有一些接受short*作为参数的原生函数。

所以我想知道,如何将jshortarray转换为原生的int input_size = env->GetArrayLength(readBuffer_); short input[input_size]; jshort *inputArray = env->GetShortArrayElements(readBuffer_, 0); for (int i = 0; i < input_size; i++) { input[i] = inputArray[i]; }

有没有正确的方法呢?

或者我应该做那样的事情

{{1}}

谢谢

1 个答案:

答案 0 :(得分:0)

看看这里:

http://jnicookbook.owsiak.org/recipe-No-012/

您可以在代码中找到jshort*作为short*的示例。您可以这样做,因为typdef中的jni.h语句:

typedef unsigned char   jboolean;
typedef unsigned short  jchar;
typedef short           jshort;
typedef float           jfloat;
typedef double          jdouble;

这样,您只需使用jshort作为short

的新名称即可
JNIEXPORT void JNICALL Java_recipeNo012_PassArray_passShortArray
  (JNIEnv *env, jclass obj, jshortArray array) {

  /* get size of the array */
  jsize len = (*env)->GetArrayLength(env, array);

  /* get the body of array; it will be referecende by C pointer */
  jshort *body = (*env)->GetShortArrayElements(env, array, 0);

  /* do some stuff */
  for(int i=0; i < len; i++) {
    printf("Short value: %hd\n", body[i]);
  }
  /* release body when you decide it is no longer needed */
  (*env)->ReleaseShortArrayElements(env, array, body, 0);
}

您可以随时仔细检查如何定义类型:JDK目录中的jni.h$PLATFORM/jni_md.h

保持这个方便也很好:

https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html

一句话!请注意,数组&gt; = 2D的管理方式完全不同。