【问题标题】:Convert float* to jfloatArray using JNI使用 JNI 将 float* 转换为 jfloatArray
【发布时间】:2014-07-29 08:59:15
【问题描述】:

我在我的 c++ 函数中获得了一个 float*,我需要将它转换为 jfloatArray 以返回我的 Java 代码。

如何将 float* 转换为 jfloatArray?

谢谢

【问题讨论】:

标签: java android c++ java-native-interface


【解决方案1】:

要将float*转换为jfloatArray,可以使用NewFloatArray,

您可以使用以下代码:

  • 变量“数据”只是简单的示例,因此您可以使用您的代码。
  • 另外,将 com_your_packagename 修改为您的真实包名。
  • 您必须将包名称的点更改为下划线。 (com.your.packagename --> com_your_packagename)

jfloatArray Java_com_your_packagename_farrayFromJNI(JNIEnv *env, jobject thiz) {
    jfloatArray result;
    result = (*env)->NewFloatArray(env, 3);

    float* data;
    data = malloc(sizeof(float) * 3);
    data[0] = 123;  data[1] = 456;  data[2] = 789;

    (*env)->SetFloatArrayRegion(env, result, 0, 3, data);
    free(data);

    return result;
}

或

extern "C"
{
JNIEXPORT jfloatArray JNICALL Java_com_your_packagename_farrayFromJNI(JNIEnv *env, jobject thiz) {

jfloatArray result;
    result = env->NewFloatArray(3);

    float* data;
    data = malloc(sizeof(float) * 3);
    data[0] = 123;  data[1] = 456;  data[2] = 789;

    env->SetFloatArrayRegion(result, 0, 3, data);
    free(data);
    return result;
};
}

【讨论】:

  • 你为什么使用指针和malloc 来代替data?为什么不只是float data[3];?
  • @PaulMcKenzie 这意味着动态分配。如果在编译时无法获取数组的大小,则可以在运行时定义指针并分配内存。但在这段代码中,它与浮点数据[3]相同。
  • 如果你不知道运行时数组的大小,更好的解决方案是使用std::vector。它不仅会自动删除自己,而且如果在 malloc() 调用和 free() 之间添加可能引发异常的额外代码,则不会发生内存泄漏。 std::vector<float> data(3); ... env->SetFloatArrayRegion(result, 0, 3, &data[0]); 另外,IMO,编写 JNI 代码是尽可能多地使用 RAII 的一个重要原因。
  • @PaulMcKenzie 绝对。我也喜欢标准向量。在这段代码中,我只想编写简单的代码。如果有机会使用矢量或 RAII 或智能指针,我会选择它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2011-06-17
  • 2014-10-06
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
相关资源
最近更新 更多