繁体   English   中英

Android:从C ++使用byte []参数调用Java方法

[英]Android: Calling java method with byte[] parameter from c++

我是一名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);
}

这是javaFunc方法:

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

当我调试func方法时, bytes指向一个字符数组,但是当我到达javaFunc方法时, bytes类似于{ javaFunc }-完全不是必须的。 任何帮助,将不胜感激。

您的SetByteArrayRegion调用错误。

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(bytes)是错误的。 这样就可以得出char*指针本身的字节大小(32位为4,64位为8),而不是所指向数据的字节大小。

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

另外,您需要在CallNonvirtualVoidMethod()退出后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<char>

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM