我有一个小的JNI方法从屏幕上检索一个像素。该方法接收来自Java的ByteBuffer并根据此问题how to write and read from bytebuffer passing from java to jni以C++写入。JNI:直接缓冲读写
虽然这工作,我注意到的第一个字节我写的是不正确的,但其他人:
输入长度为3在启动000000000239F238
颜色为202,97,79
值在Java读:-54,97%,79
这是我的节目的输出。
的C++代码:
JNIEXPORT void JNICALL Java_capturePixel(JNIEnv * env, jobject clz, jobject buffer)
{
jbyte* bufferStart = static_cast<jbyte*>(env->GetDirectBufferAddress(buffer));
jlong inputLength = env->GetDirectBufferCapacity(buffer);
HDC hScreenDC = GetDC(nullptr);
std::cout << "Input length is " << inputLength << " at start " << &bufferStart << std::endl;
COLORREF pixel = GetPixel(hScreenDC, 100, 20);
int r = GetRValue(pixel);
int g = GetGValue(pixel);
int b = GetBValue(pixel);
std::cout << "Color is " << r << ", " << g << ", " << b << std::endl;
bufferStart[0] = r;
bufferStart[1] = g;
bufferStart[2] = b;
}
我的Java代码(实际上科特林):
val r = buffer.get()
val g = buffer.get()
val b = buffer.get()
println("values read in java: $r, $g, $b")
为什么是第一个字节错了吗?我假设它必须处理它的标志?但是,为什么其他人没有错?我不知道为什么会发生这种情况。
2S补202 == -54。 Java正在输出签名值。 –
@RichardCritten你能解释为什么只发生在第一个字节? – Limnic
其他值不会设置它们设置的字节的最高位。值<= 127将输出为正,值> = 128将输出为负值。数组中的值是正确的,它只是它的输出,让你感到困惑。 –