В моем 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
Может ли кто-нибудь сказать мне, что я делаю неправильно или не вижу?
Заранее спасибо!
Значение одно и то же, оно просто напечатано по-разному.
На странице 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()
.