Как получить unsigned long long из C в Kotlin через JNI?

#android #c #kotlin #android-ndk

#Android #c #котлин #android-ndk

Вопрос:

Я хотел бы прочитать unsigned long long из моего кода Kotlin. Значение поступает из кода C через JNI.

Вот код C :

 unsigned long long getMaxValue() {
    return -1;
}
 

Вот код JNI :

 extern "C"
JNIEXPORT jlong JNICALL
Java_com_tb_of_1ir_MainActivity_getMaxValue(JNIEnv *env, jobject thiz) {
    static auto a = MyCppSingleton::get();
    return a->getMaxValue();
}
 

И вот код Kotlin :

 Toast.makeText(this, "getMaxValue : "${getMaxValue()}"", Toast.LENGTH_LONG).show()
private external fun getMaxValue(): Long
 

Я также пробовал с BigInteger, но безрезультатно…

Спасибо!

Комментарии:

1. Почему вы возвращаете отрицательное число, если возвращаемый тип равен unsigned ?

2. Это получить максимальное значение, возможное для unsigned long long .

3. Максимальное значение для unsigned long long равно std::numeric_limits<unsigned long long>::max(); . Во-вторых, я предлагаю вам использовать типы C , которые точно описывают количество битов и тип знака int64_t , uint64_t т. Е. , и т.д. вместо unsigned long long .

4. Да, вы правы, я думаю, это более явно для компилятора.

5. Java знает только целые числа со знаком, unsigned здесь не будет работать.

Ответ №1:

Это невозможно простым способом. Возможно, путем декомпозиции.