Отправка числа из JNI в код Java добавляет 2 числа

0

В моем JNI я вызываю функцию из класса OpenCL (java). Я передаю float как аргумент, но когда я его печатаю, он добавляет 2 diggits.

Код отправки JNI:

float ndrangeDuration =
    (end.tv_sec + end.tv_usec * 1e-6) - (start.tv_sec + start.tv_usec * 1e-6);

LOGD("NDRangeKernel time: %f", ndrangeDuration);

jclass MyJavaClass = (*env).FindClass("com/denayer/ovsr/OpenCL");
if (!MyJavaClass){
    LOGD("Aj :(");
    return;} /* method not found */
jmethodID setTimeFromJNI = (*env).GetMethodID(MyJavaClass, "setTimeFromJNI", "(F)V");
(*env).CallVoidMethod(thisObject, setTimeFromJNI, ndrangeDuration);

LOGD:

#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

Код java:

public void setTimeFromJNI(float time)
{
    Log.i("setTimeFromJNI","Time set on " + String.valueOf(time));

}

Вывод:

Время NDRangeKernel: 0.104581 Это от JNI

Время, установленное на 0.10458103 Это из Java

Может ли кто-нибудь сказать мне, что я делаю неправильно или не вижу?

Заранее спасибо!

Теги:
android-ndk
jni

1 ответ

0
Лучший ответ

Значение одно и то же, оно просто напечатано по-разному.

На странице printf(3):

   f, F   The double argument is rounded and converted to decimal notation
          in the style [-]ddd.ddd, where the number of  digits  after  the
          decimal-point character is equal to the precision specification.
          If the precision is missing, it is taken as 6; if the  precision
          is  explicitly  zero,  no decimal-point character appears.  If a
          decimal point appears, at least one digit appears before it.

Вы заметите, что при печати из JNI значение имеет 6 цифр после десятичной точки. Если вы использовали "%.8f" вместо "% f", вы увидите одну и ту же строку цифр с обеих сторон.

Вы можете увидеть Java-язык с плавающей точкой код формата в Android здесь. Обратите внимание, что длина вывода не имеет фиксированной крышки.

Если ваша цель состоит в том, чтобы иметь соответствующий вывод, вы можете использовать String.format() для печати значений из кода, написанного на языке программирования Java. Полное описание того, что он принимает, находится в Formatter; если вы копаете достаточно далеко, вы найдете:

Количество цифр в результате для дробной части m или равно точности. Если точность не указана, значение по умолчанию равно 6.

который соответствует поведению printf().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню