例如,JNI +类型转换(例如,签名为无符号短符号)

我在JNI地狱与typeconversions出wazoo:

以下是事物的一般流程:

  • 读取一个文件,它返回一个浮点数的一维数组。
  • 将这些浮动[]转换为短裤[](* 4095,我想要一个12位数字)
  • 将这些short []传递给C,并将它们复制到一个无符号短数组中
  • 翻转位来使大端的Java位对于图像处理来说是小端的
  • 将这些新号码转换为双[](/ 4095)
  • 将double []传递给图像处理函数
  • 将处理过的double []转换回为short [](* 4095)
  • 简而言之,将位翻转回大端
  • 将short []转换回浮动(/ 4095),传回给java
  • 将float []传递给int转换,将这些位排列成ARGB_8888格式
  • 有GOT是一个更好的方式来做到这一点。

    在所有这些废话的顶部,它不起作用。 我收回所有的噪声,我认为这可能是C中的无符号短阵列(对于位切换有用)和C中的带符号短阵列的结果。这是一个主要问题。

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

    任何你可以建议将不胜感激..


    我没有看到中间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;
    }
    
    链接地址: http://www.djcxy.com/p/58331.html

    上一篇: JNI + Type Conversion (Signed Short to Unsigned Short, for example)

    下一篇: How to print pthread