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

时间:2011-01-31 08:00:57

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

我在JNI地狱中遇到了tyzonversions wazoo:

以下是一般情况:

  • 读取一个文件,然后返回给我一个 一维花车阵列。
  • 转换这些 漂浮[]到短裤[](* 4095,我想要一个 12位数字)
  • 将这些短片[]传递给 C,在一个复制它们 unsigned short array
  • 翻转位 制作big-endian java位 用于图像处理的little-endian
  • 将这些新号码转换为a double [](/ 4095)
  • 将double []传递给 图像处理功能
  • 将已处理的double []转换为short [](* 4095)
  • 短按[]翻转位 big-endian
  • 将short []转换回float(/ 4095),传回java
  • 将float []传递给int 将位排列的转换 ARGB_8888格式

GOT是一种更好的方法。

除了那些垃圾之外,它还没有用。我收回所有噪音,我觉得这可能是C中无符号短阵列(对位切换有用)和C中有符号短阵列的结果。这是一个主要问题。

所以我想我的一般问题是,我怎样才能改进这一点,以便我不会处理所有类型之间转换的问题,包括签名/未签名问题。

你能提出的任何建议都将受到赞赏..

1 个答案:

答案 0 :(得分:2)

我没有看到使用中间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;
}