Конвертируйте const unsigned char * в jbyteArray и наоборот - PullRequest
0 голосов
/ 16 октября 2019

У меня есть два вопроса:

  1. Как преобразовать const без знака 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);
    }
    

1 Ответ

0 голосов
/ 25 октября 2019

Преобразование const без знака 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;
}

Это работает для меня.

...