Tôi thực sự là một vấn đề lớn ở đây. Tôi đang cố gắng để vượt qua một byte [] từ Java để C + + và tôi nhận được giá trị tiêu cực sau khi chuyển đổi. Tôi đã xác định vấn đề từ việc có các ký tự duy nhất trong byte Java [] sau khi chuyển đổi và thực hiện nhật ký, các giá trị là 0 hoặc âm.Chuyển đổi JNI Java byte [] thành C++ bytearray, trả về 0
Tôi đã thử sử dụng một byte thử nghiệm [] của các ký tự String và nó hoạt động tốt.
Đây là mã của tôi, nếu nó giúp.
Java
public static native void SendMessage(byte[] message, int size); //size = message.length
C++
static void SendMessage(JNIEnv *env, jclass cls, jbyteArray array, jint array_length)
{
jbyte* content_array = (env)->GetByteArrayElements(array,NULL);
//*env->GetByteArrayRegion(array,0,array_length,content_array); //tried this as well, same results
LOGD("content:\n");
for (int i=0; i < array_length; i++)
{
LOGD("%d",content_array[i]);
}
//EDIT
SendMessage(client, (uint8_t*)content_array, array_length); //<- could the problem be at the point where I convert it to uint8_t?
(env)->ReleaseByteArrayElements(array,content_array,0);
}
Output
content: 48
content: 23
content: 13
content: 56
content: 0 // <--- the problem starts here
content: -122
content: 0
content: 78
content: 32
content: -28
etc...
..
..
Bây giờ, sử dụng một byte kiểm tra đơn giản [] Java
String test = "ABC";
byte[] message = test.getBytes();
public static native void SendMessage(byte[] message, int size); //size = message.length
C++
static void SendMessage(JNIEnv *env, jclass cls, jbyteArray array, jint array_length)
{
jbyte* content_array = (env)->GetByteArrayElements(array,NULL);
//*env->GetByteArrayRegion(array,0,array_length,content_array); //tried this as well, same results
LOGD("content:\n");
for (int i=0; i < array_length; i++)
{
LOGD("%d",content_array[i]);
}
(env)->ReleaseByteArrayElements(array,content_array,0);
}
Output
content: 65 //this works perfectly
content: 66
content: 67
Nhờ sự giúp đỡ của bạn. Nhiều đánh giá cao.
Cảm ơn bạn đã trả lời. Không, tôi không nhận được byte [] từ một chuyển đổi Chuỗi. Byte được truyền từ một nguồn khác. Tôi đã có thể chuyển đổi nó thành chuỗi ở phía Java cho mục đích ghi nhật ký và thấy rằng nó chứa các ký tự duy nhất. Bạn đã đề cập về mã hóa khác nhau. Làm cách nào để tôi đặt mã hóa khác từ nền tảng mặc định? – user2117849
Sử dụng [String.getBytes (Charset)] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#getBytes (java.nio.charset.Charset)). –