这是我到目前为止所做的:
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。感谢
答案 0 :(得分:1)
如何将此jbyte *转换为void *它是一个简单的(void *)强制转换?
假设您想要传递它指向的数据,是的。或者只是将jbyte*
传递给dlpspec_scan_read_configuration
而不进行任何投射。无论哪种方式,您都有责任确保它是dlpspec_scan_read_configuration
的正确数据类型(例如,如果您的函数需要void*
到ASCII字符串,但是您传递了它void*
到Unicode字符串,那么您可能无法获得所需的结果。)
jsize to size_t转换怎么样
jsize
是jint
的别名,它是带符号的32位整数类型。另一方面,size_t
是未指定大小的无符号整数类型。因此,您应检查jsize
是否在0..SIZE_MAX
范围内。如果是,您可以将其投射到size_t
。如果不是,那么由您决定要做什么(钳制值,返回错误,中止程序,......)。