JNI:本机库需要 void*,如何将我的 jbytearray 转换为 C void*

JNI: Native library requires void*, how can I convert my jbytearray to C void*

这是我目前的情况:

Java:

public static native String getConfigName(byte[] array);

C:(下面的代码returns编译的虚拟值)

jstring Java_com_example_plugin_HelloJni_getConfigName( JNIEnv* env, jobject thiz, jbyteArray array )
{

    // get jbyte array from array and it's length
    jbyte* bufferPtr = (*env)->GetByteArrayElements(env, array, NULL);
    jsize lengthOfArray = (*env)->GetArrayLength(env, array);

    // Code I need to run using void* and size_t
    dlpspec_scan_read_configuration (   void *  pBuf, const size_t  bufSize )

    // release array
    (*env)->ReleaseByteArrayElements(env, array, bufferPtr, 0);

    return (*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI");
}

我如何将这个 jbyte* 转换为 void* 是否是一个简单的 (void*) 转换? jsize 到 size_t 的转换又如何呢?这是我第一次使用 JNI 和 Android NDK。谢谢

How can I convert this jbyte* to a void* would it be a simple (void*) cast?

假设您想按原样传递它指向的数据,是的。或者直接将 jbyte* 传递给 dlpspec_scan_read_configuration 而无需任何转换。无论哪种方式,您都有责任确保它是 dlpspec_scan_read_configuration 的正确数据类型(例如,如果您的函数需要 void* 到 ASCII 字符串,但您将 void* 传递给 Unicode string 那么你可能不会得到想要的结果)。

what about the jsize to size_t conversion

jsizejint的别名,是有符号的32位整数类型。另一方面,size_t 是未指定大小的无符号整数类型。所以您应该检查您的 jsize 是否在 0..SIZE_MAX 范围内。如果是,您可以将其转换为 size_t。如果不是,则取决于您想要做什么(钳制值,return 错误,中止程序,...)。