java - 从 Java 存储中检索未知长度的字节数组

标签 java c java-native-interface

我已经发布了一个关于它的问题,但当时我还没有帐户。我收到了回复,但我仍然很困惑,无法继续讨论该话题。

我将再次发布问题以及之前对话的链接。

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/

相关文章:

java - 将数组从 JNI 传递到 Java

android - 正确构建适用于所有 Android 架构的 FFmpeg

android - java.lang.UnsatisfiedLinkError : com. android.tools.fd.runtime.IncrementalClassLoader

java - CXF NullPointerException(无法在 Tomcat 7 上编译 Web 服务 stub )

c - 删除 c 字符串时如何删除这些警告

java - Artifact 部署 Tomcat 9 期间的应用程序错误

c - 如何从c中的数字中的最高有效数字开始获得不同的数字?

c++ - HKEY 句柄为 NULL,在调试期间它写入未使用的<无法读取内存>

java - 在 Kotlin(和 Gradle)中使用 Hibernate Validator Annotation Processor

java - "AWT widgets written in Java which delegated to peer classes that were written in C"是什么意思?