我已经发布了一个关于它的问题,但当时我还没有帐户。我收到了回复,但我仍然很困惑,无法继续讨论该话题。
我将再次发布问题以及之前对话的链接。
Returning char array from java to string - JNI
我在 Java 中存储的数据是序列化的。我使用以下代码进行 java 函数调用。
以下代码假定C的char与Java的byte兼容,因为Java的char是2字节,而C的char是1字节。 jbyte也是一个signed char*
//value will be the serialized data
void store(char* key, char* value, int val_len)
{
//consider the jclass and methodid are already initialized
jstring j_key = (*env)->NewStringUTF(env, key);
jbyteArray j_value = (*env)->NewByteArray(env, val_len);
(*env)->SetByteArrayRegion(env, j_value, 0, val_len, (jbyte *)value);
//The store method on java side will save the value (as is) in memory
(*env)->CallStaticVoidMethod(j_class, store_method, key, value);
(*env)->ReleaseByteArrayElements(env, j_value, (jbyte *)value, JNI_ABORT);
(*env)->ReleaseStringUTFChars(env, j_key, key);
保存数据后,我使用另一个函数从存储中检索数据。那时我不知道我要检索的数据大小。我的 API 在 C 中,存储在 Java 中。我将使用我的 C 函数与 Java 交互。并且还可以有多个线程同时从 Java 存储中检索数据。
我正在从 C 调用 Java,我的控件在检索数据后应该返回到 C 程序。我对代码的工作方式有点困惑。我将如何获取指向数组的指针(从 java 检索),然后使用 GetByteArrayElements 检索它。请记住,我事先不知道要检索的数据大小,因此无法使用 NewByteArray 函数创建字节数组,然后用 Java 代码填充数据。
最佳答案
好的,我想通了。我会把它放在这里,以便其他人也可以利用它。
考虑以下返回字节数组的 java 方法(只是一个虚拟代码,没有检查等)
public static byte[] GetData(){
return myStore.getData();
}
在C端,你可以像下面这样获取byte[]
void get_data()
{
int len = 0;
char* value = NULL;
/*Consider j_class, and j_methodid are already initialized*/
jbyteArray j_value = (*env)->CallStaticObjectMethod(env, j_class, j_methodid);
if(j_value != NULL)
{
len = (*env)->GetArrayLength(env, j_value);
value = (*env)->GetByteArrayElements(env, j_value, NULL);
}
/*later on release the resource*/
(*env)->ReleaseByteArrayElements(env, j_value, value, 0);
}
我已经检查过它并且有效。我现在要检查二维数组。我认为它与此相同,只是您将获得 jobjectArray 并且此数组的每个元素都是一个 jbyteArray。
关于java - 从 Java 存储中检索未知长度的字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1232236/