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