私は画面からピクセルを取得する小さなJNIメソッドを持っています。このメソッドは、JavaからByteBufferを受け取り、この質問how to write and read from bytebuffer passing from java to jniに従ってC++に書き込まれます。JNI:直接バッファの読み込みと書き込み
これは仕事をしている間、私は私が書く最初のバイトが正しくありませんが、他の人がしている気づい:
入力の長さが開始000000000239F238
色は202、97、79
あるで3ある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コード(実際にはKotlin):
val r = buffer.get()
val g = buffer.get()
val b = buffer.get()
println("values read in java: $r, $g, $b")
なぜ最初のバイトが間違っていますか?私はそれがその標識と関係していると仮定していますか?しかし、もう一度、なぜ他人は間違っていないのですか?なぜこれが起こっているのか分かりません。
2Sは202 ==を補完:あなたは、このようなバッファ上のget()を呼び出すために使用することができます
:
また、あなたはKotlinで拡張メソッドを作成することができます-54。 Javaが符号付きの値を出力しています。 –
@RichardCrittenなぜ最初のバイトだけが発生するのか説明できますか? – Limnic
他の値は、設定しているバイトの最上位ビットを設定しません。値<= 127が正として出力され、値> = 128が負として出力されます。配列の値は正しいですが、それは出力だけであなたを混乱させます。 –