gpt4 book ai didi

java - JNI : Native library requires void*, 如何将 jbytearray 转换为 C void*

转载 作者:行者123 更新时间:2023-11-30 15:10:15 32 4
gpt4 key购买 nike

这是我到目前为止所拥有的:

Java:

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

C:(下面的代码返回一个用于编译的虚拟值)

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 字符串,那么您可能不会得到所需的结果)。

what about the jsize to size_t conversion

jsizejint 的别名,它是有符号的 32 位整数类型。另一方面,size_t 是未指定大小的无符号整数类型。因此,您应该检查您的 jsize 是否在 0..SIZE_MAX 范围内。如果是,您可以将其转换为 size_t。如果不是,则取决于您想要执行的操作(限制值、返回错误、中止程序……)。

关于java - JNI : Native library requires void*, 如何将 jbytearray 转换为 C void*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36301730/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com