【问题标题】:JNI + Type Conversion (Signed Short to Unsigned Short, for example)JNI + 类型转换(例如,有符号短到无符号短)
【发布时间】:2011-06-18 10:28:56
【问题描述】:

我在 JNI 地狱中,类型转换超出了 wazoo:

这是事情的一般流程:

  • 读取一个文件,它返回给我一个 一维浮点数组。
  • 转换这些 floats[] 到 shorts[] (*4095, 我想要一个 12位数字)
  • 将这些短裤[]传递给 C,将它们复制到一个 无符号短数组
  • 翻转位 制作大端Java位 用于图像处理的小端序
  • 将这些新数字转换为 双[] (/4095)
  • 将 double[] 传递给 图像处理功能
  • 将处理后的 double[] 转换回 short[] (*4095)
  • 简而言之[]将位翻转回 大端
  • 将short[] 转换回float (/4095),传回java
  • 将 float[] 传递给 int 将位排列为的转换 ARGB_8888 格式

必须有更好的方法来做到这一点。

除了所有这些废话之外,它还不起作用。我正在恢复所有噪音,我觉得这可能是 C 中的无符号短数组(用于位切换)和 C 中的有符号短数组的结果。这是一个主要问题。

所以我想我的一般问题是,我该如何改进这一点,以便我不处理类型之间转换的所有这些问题,包括有符号/无符号问题。

您可以提出任何建议,我们将不胜感激..

【问题讨论】:

    标签: java android c java-native-interface type-conversion


    【解决方案1】:

    我没有看到使用中间 short 表示的好处,因为 Java 代码使用浮点数,而 C 代码使用双精度数。我会这样做:

    float[] floats = readFile();
    
    // Convert to little-endian doubles
    ByteBuffer bb = ByteBuffer.allocateDirect(4 * floats.length);
    bb.order(ByteOrder.LITTLE_ENDIAN);
    DoubleBuffer db = bb.asDoubleBuffer();
    for (int i = 0; i < floats.length; ++ i) {
        db.put(i, floats[i]);
    }
    
    doImageProcessing(bb); // Native method
    
    // Convert double values to ARGB
    int j = 0;
    int[] argb = new int[floats.length / 4];
    for (int i = 0; i < floats.length; i += 4) {
        int a = Math.max(0, Math.min((int) (db.get(i) * 256.0), 255));
        int r = Math.max(0, Math.min((int) (db.get(i+1) * 256.0), 255));
        int g = Math.max(0, Math.min((int) (db.get(i+2) * 256.0), 255));
        int b = Math.max(0, Math.min((int) (db.get(i+3) * 256.0), 255));
        argb[j++] = (a<<24)|(r<<16)|(g<<8)|b;
    }
    

    【讨论】:

    • shorts 在这个工作流程中的唯一原因是因为本机函数需要 little-endian 位排列,而数据以 big-endian 初始化。
    • 你说得对,我不需要那个中间步骤。谢谢。这很棒。
    猜你喜欢
    • 1970-01-01
    • 2013-02-16
    • 2016-02-17
    • 1970-01-01
    • 2015-10-21
    • 2016-08-13
    • 1970-01-01
    • 2013-06-23
    • 2011-09-29
    相关资源
    最近更新 更多