Search code examples
javajava-native-interfacec++-cli

Convert const unsigned char* to jbyteArray and vice versa


I have two questions:

  1. How to convert const unsigned char* to 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. How to convert jbyteArray to const unsigned char*?

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

Solution

  • Convert const unsigned char* to 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;
    }
    

    Convert jbyteArray to 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;
    }
    

    It works for me.