2013-05-21 87 views
20

我是C++和JNI的新手,我尝试通过使用JNI找到一种将Java中的byte []转换为C++中的unsigned char *的正确方法,反之亦然! (我正在使用android) 在google和SO中寻找解决方案后,我还没有找到一个好的细节方法来将java中的byte []转换为C++。请帮助我,并提供解决方案,反之亦然(在C中的unsigned char *到byte []中的java)。非常感谢将java中的byte []转换为C++中的unsigned char *的正确方法,反之亦然?

  • 字节[]中的java为unsigned char *在C++:

JAVA:

private static native void nativeReceiveDataFromServer(byte[] value, int length); 

JNI:

... (JNIEnv* env, jobject thiz, jbyteArray array, jint array_length) 
{ 
    ??? 
} 

PS:我修改我的问题为是我的问题:(

+0

当然好了。你不能用C编写C++,这不是一个真正的问题。 – EJP

+0

@EJP我认为你还没有看完我的所有问题!主要问题是“我是C++和JNI的新手,我试图找到一种正确的方法来将java中的byte []转换为使用JNI的C++中的unsigned char *,反之亦然!....请更正我if我错了,并提供了一个解决方案,反之亦然(无符号字符*在C中的Java到byte [])“!你可以帮我吗?如果你还没有读完所有的问题,我认为你不应该降级我的观点! –

+0

在我看来,你正在尝试使用c编译器来编译C++代码。 – Zharf

回答

51

您可以使用此unsigned char数组转换成jbyteArray

jbyteArray as_byte_array(unsigned char* buf, int len) { 
    jbyteArray array = env->NewByteArray (len); 
    env->SetByteArrayRegion (array, 0, len, reinterpret_cast<jbyte*>(buf)); 
    return array; 
} 

到周围的其他方法转换...

一个真正的问题
unsigned char* as_unsigned_char_array(jbyteArray array) { 
    int len = env->GetArrayLength (array); 
    unsigned char* buf = new unsigned char[len]; 
    env->GetByteArrayRegion (array, 0, len, reinterpret_cast<jbyte*>(buf)); 
    return buf; 
} 
+0

下面的解决方案如何,它与你的不同吗?有什么更好的? 'jbyte * content_array =(* env) - > GetByteArrayElements(env,array,NULL); \t // if(content_array == NULL) \t \t // return 0; \t \t ReceiveDataFromServer(content_array,array_length); \t(* env) - > ReleaseByteArrayElements(env,array,content_array,JNI_ABORT); ' –

+1

这将工作几乎相同。不同的是,在您的代码中,您提供了本地代码缓冲区来放入数据,在我的版本中,本地代码创建缓冲区。哪个更好取决于用例。 – Zharf

+0

@Zharf,“buf”如何在as_unsigned_char_array()中被释放? – ransh

相关问题