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

时间:2016-03-30 06:56:18

标签: java c android-ndk java-native-interface

这是我到目前为止所做的:

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。感谢

1 个答案:

答案 0 :(得分:1)

  

如何将此jbyte *转换为void *它是一个简单的(void *)强制转换?

假设您想要传递它指向的数据,是的。或者只是将jbyte*传递给dlpspec_scan_read_configuration而不进行任何投射。无论哪种方式,您都有责任确保它是dlpspec_scan_read_configuration的正确数据类型(例如,如果您的函数需要void*到ASCII字符串,但是您传递了它void*到Unicode字符串,那么您可能无法获得所需的结果。)

  

jsize to size_t转换怎么样

jsizejint的别名,它是带符号的32位整数类型。另一方面,size_t是未指定大小的无符号整数类型。因此,您应检查jsize是否在0..SIZE_MAX范围内。如果是,您可以将其投射到size_t。如果不是,那么由您决定要做什么(钳制值,返回错误,中止程序,......)。