Android:从c+;调用带有byte[]参数的java方法+; 我是一个Android开发者,对JNI来说是新的东西,我想做的就是把一个字节数组从C++方法传递给java方法。下面是我的C++方法的样子: void func(char* bytes) { jclass callbackClass = fJNIEnv->GetObjectClass(fJObject); jmethodID javaFunc = fJNIEnv->GetMethodID(callbackClass, "javaFunc", "([B)V"); jbyteArray array = fJNIEnv->NewByteArray(sizeof(bytes)); fJNIEnv->SetByteArrayRegion(array, 0, sizeof(bytes), (jbyte *) bytes); fJNIEnv->CallNonvirtualVoidMethod(fJObject, callbackClass, javaFunc, array); }

Android:从c+;调用带有byte[]参数的java方法+; 我是一个Android开发者,对JNI来说是新的东西,我想做的就是把一个字节数组从C++方法传递给java方法。下面是我的C++方法的样子: void func(char* bytes) { jclass callbackClass = fJNIEnv->GetObjectClass(fJObject); jmethodID javaFunc = fJNIEnv->GetMethodID(callbackClass, "javaFunc", "([B)V"); jbyteArray array = fJNIEnv->NewByteArray(sizeof(bytes)); fJNIEnv->SetByteArrayRegion(array, 0, sizeof(bytes), (jbyte *) bytes); fJNIEnv->CallNonvirtualVoidMethod(fJObject, callbackClass, javaFunc, array); },java,android,c++,arrays,java-native-interface,Java,Android,C++,Arrays,Java Native Interface,下面是javaFunc方法: public void javaFunc(byte[] bytes) { ... } 当我调试func方法时,bytes指向一个字符数组,但是当我使用javaFunc方法时,bytes类似于{16,0,0,0}-它与必须的情况完全不同。任何帮助都将不胜感激。您的setbyterrayregion呼叫错误 fJNIEnv->SetByteArrayRegion(array, 0, sizeof(bytes), (jbyte *) bytes); 应该

下面是javaFunc方法:

public void javaFunc(byte[] bytes) {
    ...
}

当我调试func方法时,
bytes
指向一个字符数组,但是当我使用
javaFunc
方法时,
bytes
类似于{16,0,0,0}-它与必须的情况完全不同。任何帮助都将不胜感激。

您的
setbyterrayregion
呼叫错误

fJNIEnv->SetByteArrayRegion(array, 0, sizeof(bytes), (jbyte *) bytes);
应该是

fJNIEnv->SetByteArrayRegion(fJNIEnv, array, 0, number of bytes, (jbyte *) bytes);
语法是:

SetByteArrayRegion(env, byteArray, from, size, a + from);
使用
sizeof(字节)
是错误的。这将为您提供
char*
指针本身的字节大小(32位为4,64位为8),而不是指向的数据的字节大小

您需要更改
func()
以传入数组中
char
s的数量。然后,您可以在分配和填充JNI数组时使用该数字


另外,您需要在退出
CallNonvirtualVoidMethod()
后释放JNI数组

试试这个:

void func(char* bytes, int numBytes)
{
    jclass callbackClass = fJNIEnv->GetObjectClass(fJObject);
    jmethodID javaFunc = fJNIEnv->GetMethodID(callbackClass, "javaFunc", "([B)V");

    jbyteArray array = fJNIEnv->NewByteArray(numBytes);
    fJNIEnv->SetByteArrayRegion(array, 0, numBytes, (jbyte *) bytes);

    fJNIEnv->CallNonvirtualVoidMethod(fJObject, callbackClass, javaFunc, array);
    fJNIEnv->DeleteLocalRef(array);
}

可选地,在一个更合适的C++容器中传递,如<代码> STD::vector < /C> >:

void func(常量std::向量和字节)
{
jclass callbackClass=fJNIEnv->GetObjectClass(fJObject);
jmethodidjavafunc=fJNIEnv->GetMethodID(callbackClass,“javaFunc”,“([B)V”);
jbyterarray=fJNIEnv->NewByteArray(bytes.size());
fJNIEnv->SetByteArrayRegion(数组,0,bytes.size(),(jbyte*)bytes.data());
fJNIEnv->CallNonvirtualVoidMethod(fJObject、callbackClass、javaFunc、array);
fJNIEnv->DeleteLocalRef(数组);
}

sizeof(bytes)
是错误的。这给出了
char*
指针本身的字节大小(32位4,64位8),而不是指向的数据的字节大小。您需要更改
func()
以传递数组中
char
的数量,即
void func(char*bytes,int numBytes)
,或传入一个更合适的容器,如
std::vector
,即
func(const std::vector&bytes)
。然后,在分配和填充JNI数组时可以使用实际字节计数。因此,在
CallNonvirtualVoidMethod()
退出后,即
fJNIEnv->DeleteLocalRef(数组)后,需要释放JNI数组
。不要忘记将
字节数
传递给
fJNIEnv->NewByteArray()
,因为使用
sizeof(bytes)
也有错误
void func(const std::vector<char> &bytes)
{
    jclass callbackClass = fJNIEnv->GetObjectClass(fJObject);
    jmethodID javaFunc = fJNIEnv->GetMethodID(callbackClass, "javaFunc", "([B)V");

    jbyteArray array = fJNIEnv->NewByteArray(bytes.size());
    fJNIEnv->SetByteArrayRegion(array, 0, bytes.size(), (jbyte *) bytes.data());

    fJNIEnv->CallNonvirtualVoidMethod(fJObject, callbackClass, javaFunc, array);
    fJNIEnv->DeleteLocalRef(array);
}