2016-03-30 2 views
0

Вот то, что я до сих пор:JNI: Native библиотека требует аннулировать *, как я могу конвертировать мой jbytearray в C пустоте *

Java:

public static native String getConfigName(byte[] array);

C: (приведенный ниже код возвращает фиктивное значение для компиляции)

jstring Java_com_example_plugin_HelloJni_getConfigName(JNIEnv* env, jobject thiz, jbyteArray array) 
{ 

    // get jbyte array from array and it's length 
    jbyte* bufferPtr = (*env)->GetByteArrayElements(env, array, NULL); 
    jsize lengthOfArray = (*env)->GetArrayLength(env, array); 

    // Code I need to run using void* and size_t 
    dlpspec_scan_read_configuration ( void * pBuf, const size_t bufSize) 

    // release array 
    (*env)->ReleaseByteArrayElements(env, array, bufferPtr, 0); 

    return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI"); 
} 

Как я могу превратите этот jbyte * в void *, будет ли это просто (void *)? также как насчет преобразования jsize в size_t? это мой первый опыт использования JNI и Android NDK. Спасибо

+0

Вам не нужно ничего вводить в 'void *'. – EJP

ответ

1

Как я могу преобразовать этот jbyte * в void * будет ли это просто (void *)?

Предполагая, что вы хотите передать данные, которые он указывает на как есть, да. Или просто передайте свой jbyte* на dlpspec_scan_read_configuration без кастинга. В любом случае, это ваша ответственность, чтобы убедиться, что это правильный тип данных для dlpspec_scan_read_configuration (например, если ваша функция ожидает void* строки ASCII, но вы передаете ей void* в строку Unicode, то вы, вероятно, не получите желаемого результата) ,

насчет jsize на size_t преобразования

jsize является псевдонимом для jint, который представляет собой 32-битное целое число типа. size_t, с другой стороны, представляет собой неподписанный целочисленный тип неопределенного размера. Поэтому вы должны проверить, что ваш jsize находится в диапазоне 0..SIZE_MAX. Если это так, вы можете направить его на size_t. Если это не так, вам решать, что вы хотите сделать (зажмите значение, верните ошибку, прервите программу, ...).

+0

Удивительный, спасибо. Предполагается, что функция должна принимать буфер, указывающий на tpl сериализованный двоичный файл структуры данных конфигурации сканирования. Поэтому я думаю, что мне будет хорошо. Дополнительная информация о tpl: https://troydhanson.github.io/tpl/ – clement360

Смежные вопросы