создание общего объекта - компиляция с помощью ниндзя работает на OSX и Ubuntu Crush на Windows

Я пытаюсь создать оболочку cld3 для языка на основе JVM, используя Java Abstracted Foreign Function Layer .

Я создал небольшой класс, который преобразует ответ из библиотеки C++ в буфер.

void detect(long ptr, const char *text, const char *into) {

    NNetLanguageIdentifier *nptr = (NNetLanguageIdentifier *) ptr;
    NNetLanguageIdentifier::Result res = nptr->FindLanguage(text);

    long current = (long) into;

    *((float *) current) = res.probability;
    current += sizeof(float);
    *((float *) current) = res.proportion;
    current += sizeof(float);
    *((short *) current) = res.is_reliable;
    current += sizeof(short);
    *((int *) current) = res.language.size();
    current += sizeof(int);

    memccpy(reinterpret_cast<void *>(current), res.language.c_str(), res.language.size() + 1, sizeof(res.language));

}

затем на стороне JVM:

   fun detect(text: String): LangDetectResponse {
        val buffer = ByteArray(SINGLE_LANGUAGE_DETECTION_BUFFER_SIZE)
        detector.detect(ptr, text, buffer)

        ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN).let {
            return extractResponseFromByteBuffer(it)
        }
    }

    private fun extractResponseFromByteBuffer(byteBuffer: ByteBuffer): LangDetectResponse {
        val probability = byteBuffer.float
        val proportion = byteBuffer.float
        val isReliable = byteBuffer.short
        val sizeOfLanguage = byteBuffer.int
        val languageBuffer = ByteArray(sizeOfLanguage) { 127.toByte() }
        byteBuffer.get(languageBuffer, 0, sizeOfLanguage)
        val language = String(languageBuffer, StandardCharsets.UTF_8)
        return LangDetectResponse(probability, proportion, isReliable.toInt() == 1, language)
    }

Мне удалось скомпилировать этот код с помощью системы сборки Ninja.

и создал так и файлы dylib:

https://github.com/ntedgi/cld3-kotlin#operations-systems-support

все работает нормально.

Я пытаюсь создать общий объект в windows с тем же кодом, который использую для компиляции других операционных систем, и получаю следующие ошибки:

../../third_party/cld_3/src/src/Cld3LangDetector.cc(19,36): error: cast to 'chrome_lang_id::NNetLanguageIdentifier *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    NNetLanguageIdentifier *nptr = (NNetLanguageIdentifier *) ptr;
                                   ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(25,36): error: cast to 'chrome_lang_id::NNetLanguageIdentifier *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    NNetLanguageIdentifier *nptr = (NNetLanguageIdentifier *) ptr;
                                   ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(31,7): error: cast to 'float *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    *((float *) current) = res.probability;
      ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(33,7): error: cast to 'float *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    *((float *) current) = res.proportion;
      ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(35,7): error: cast to 'short *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    *((short *) current) = res.is_reliable;
      ^
../../third_party/cld_3/src/src/Cld3LangDetector.cc(37,7): error: cast to 'int *' from smaller integer type 'long' [-Werror,-Wint-to-pointer-cast]
    *((int *) current) = res.language.size();
      ^

Я уже пытался передать cflags в сборку ниндзя.

Я буду рад узнать, как решить эту проблему, а также понять, почему другие операционные системы допускают эту ошибку.

Спасибо.


person Naor Tedgi    schedule 09.06.2019    source источник


Ответы (1)


long не подходит для хранения значения указателя. В 64-битной Windows long обычно только 32-битная. Вместо этого вы должны использовать ::std::uintptr_t, который гарантированно будет достаточно большим.

person user7860670    schedule 09.06.2019
comment
Я также добавлю, что вся арифметика указателей, выполняемая в результате этого неправильного преобразования в long, имеет неприятный запах кода и, конечно же, похожа на ряд нарушений строгого сглаживания. - person Andrew Henle; 09.06.2019