将 const unsigned char* 转换为 jbyteArray,反之亦然

Convert const unsigned char* to jbyteArray and vice versa

我有两个问题:

  1. 如何将const unsigned char*转为jbyteArray?

    JNIEXPORT jbyteArray JNICALL Java_MyJavaApplication_readValue(JNIEnv* env, jobject obj)
    {
        const unsigned char* someConstUnsignedChar = (gcnew MyCSharpLibrary())->readValue();
        // What should be here?
        return someJbyteArray;
    }
    
  2. 如何将jbyteArray转为const unsigned char*?

    JNIEXPORT jboolean JNICALL Java_MyJavaApplication_writeValue(JNIEnv* env, jobject obj, jbyteArray someJbyteArray)
    {
        // What should be here?
        return (gcnew MyCSharpLibrary())->writeValue(someConstUnsignedChar);
    }
    

将 const unsigned char* 转换为 jbyteArray:

#include <tuple>

JNIEXPORT jbyteArray JNICALL Java_MyJavaApplication_readValue(JNIEnv* env, jobject obj)
{
    const unsigned char* someConstUnsignedChar;
    int len;
    std::tie(someConstUnsignedChar, len) = (gcnew MyCSharpLibrary())->readValue();

    jbyteArray someJbyteArray = env->NewByteArray((jsize)len);
    env->SetByteArrayRegion(someJbyteArray, 0, len, reinterpret_cast<const jbyte*>(someConstUnsignedChar));

    return someJbyteArray;
}

将 jbyteArray 转换为 const unsigned char*:

JNIEXPORT jboolean JNICALL Java_MyJavaApplication_writeValue(JNIEnv* env, jobject obj, jbyteArray someJbyteArray)
{
    jsize len = env->GetArrayLength(someJbyteArray);
    jbyte* body = env->GetByteArrayElements(someJbyteArray, 0);
    unsigned char* someUnsignedChar = new unsigned char[len];
    for (jint i = 0; i < len; i++)
    {
        someUnsignedChar[i] = (unsigned char)body[i];
    }

    bool result = (gcnew MyCSharpLibrary())->writeValue((const unsigned char*)someUnsignedChar);

    env->ReleaseByteArrayElements(someJbyteArray, body, 0);
    return (jboolean)result;
}

对我有用。