【问题标题】:The right way to convert Jni Type to Native typeJni Type转Native类型的正确方法
【发布时间】:2017-11-26 13:04:13
【问题描述】:

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

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];
}

谢谢

【问题讨论】:

  • jshort * 可转换为 short * 本机函数是否期望 short * 在返回后有效?顺便说一句——GetShortArrayElements 后面应该跟 ReleaseShortArrayElements
  • @TomBlodget 感谢您的回复,请将其作为答案发布

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


【解决方案1】:

看这里:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 2013-03-12
    • 1970-01-01
    • 2011-08-09
    • 2022-07-19
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多