没明白你的意思,你是不是想从jni返回一个byte数组?我直接从源码里弄了一个例子给你看看
private native byte[] onSaveInstanceStateNative(int handle);
static jbyteArray
onSaveInstanceState_native(JNIEnv* env, jobject clazz, jint handle)
{
LOG_TRACE("onSaveInstanceState_native"); jbyteArray array = NULL; if (handle != 0) {
NativeCode* code = (NativeCode*)handle;
if (code->callbacks.onSaveInstanceState != NULL) {
size_t len = 0;
jbyte* state = (jbyte*)code->callbacks.onSaveInstanceState(code, &len);
if (len > 0) {
array = env->NewByteArray(len);
if (array != NULL) {
env->SetByteArrayRegion(array, 0, len, state);
}
}
if (state != NULL) {
free(state);
}
}
} return array;
}
private native byte[] onSaveInstanceStateNative(int handle);
static jbyteArray
onSaveInstanceState_native(JNIEnv* env, jobject clazz, jint handle)
{
LOG_TRACE("onSaveInstanceState_native"); jbyteArray array = NULL; if (handle != 0) {
NativeCode* code = (NativeCode*)handle;
if (code->callbacks.onSaveInstanceState != NULL) {
size_t len = 0;
jbyte* state = (jbyte*)code->callbacks.onSaveInstanceState(code, &len);
if (len > 0) {
array = env->NewByteArray(len);
if (array != NULL) {
env->SetByteArrayRegion(array, 0, len, state);
}
}
if (state != NULL) {
free(state);
}
}
} return array;
}
回复:lieri111
既然不会回收,那么我通过什么函数来回收呢,我没有找到相关的函数啊????
在次传到native的话是byte[] value类型的.native层接收并处理就行了.有什么问题吗?
在次传到native的话是byte[] value类型的.native层接收并处理就行了.有什么问题吗?
谢谢回复,请看下我的代码:
jbyteArray Java_com_example_test_Getdata(JNIEnv *env, jobject thiz)
{
.................///一些其他获取数据的代码
byteArray = (*env)->NewByteArray(env, size);
if (byteArray == NULL)
{
return NULL;
}
(*env)->SetByteArrayRegion(env, byteArray, 0, size,(jbyte *)data);
return byteArray;
}void Java_com_example_test_Setdata(JNIEnv *env, jobject thiz,jbyteArray jbuffer,jint size)
{ jbyteArray byteArray = NULL;
jbyte data[size];
(*env)->GetByteArrayRegion(env,jbuffer, 0, size, data); ///<-----这里出问题,请教下为什么,谢谢!!!
__android_log_print(ANDROID_LOG_INFO, "test", "test-----%.2x--%.2x--%.2x--%.2x--%.2x--%.2x--%.2x--",
size,
data[0],
data[1],
data[2],
data[3],
data[4],
data[5],
data[6]);
return ;
}
然后在java层调用的函数是: byte[] demoPtr=xxxx.Getdata();
。。//一些其他的操作
xxxx.Setdata(demoPtr,demosize);这样 就在native的 setData()函数中出错了,请问下为什么,谢谢!
GetByteArrayRegion最后一个参数要是(jbyte *)类型的
参考以下:
char* Utility::getByteArrayValue(JNIEnv* env, jbyteArray byteArray, int* dataLength) {
char* data = NULL;
if (NULL != byteArray) {
jint length = env->GetArrayLength(byteArray); *dataLength = length;
if (0 < *dataLength) {
data = new char[length];
env->GetByteArrayRegion(byteArray, (jint)0, length, (jbyte *) data);
}
}
return data;
}PS:你的代码是C的,所以有 (*env)->.这个你别管,上面代码是C++的
我看了下区别就是GetByteArrayRegion的最后一个参数类型
还有一个不明白的是:
这个我用NewByteArray分配的内存,需要自己释放还是java会回收,如果要自己释放,我应该调用哪个函数,谢谢?
(*env)->DeleteLocalRef这样就可以清理了.
--在jni接口的c或cpp文件中加上:#include <jni.h>