2013-05-01 3 views
1

Это моя функция:Android NDK передавая длинных значения нативного метода

Long Java_my_package_MainActivity_getDistance(JNIEnv* env, jobject obj, Long a_id1,Long a_id2) 
    { 
     char temp[128]; 
     sprintf(temp,"ID1: %u , ID2: %u",a_id1, a_id2); 
     __android_log_print(ANDROID_LOG_INFO, "From NDK : ", temp); 
     return(0);//just to test ... 
    } 

Long типа Защита:

typedef long long Long; 

, потому что у меня есть некоторые значения, которые терка, чем максимальное значение ИНТА тип

в моем Java класс:

static { 
      System.loadLibrary("module"); 
     } 
     // declare the native code function - must match ndkfoo.c 
    private native int getDistance(long id1, long id2); 

я называю родную функцию с этой линии:

getDistance(1234,2456); 

выход в LogCat является:

ID1: 1234, ID2: 0 

Я всегда получаю ID2 = 0 !!, я не знаю, почему второй параметр всегда оценивайте до 0!

ответ

2

Ваш sprintf должен использовать %llu для печати 64-битного количества, а не %u. Я считаю, что вы на самом деле получаете правильные значения через JNI, но вызов sprintf предлагается ожидать два 32-битных значения и печатает высокое слово первого аргумента.

Кроме того, вероятно, вы должны использовать jlong в объявлениях JNI, а не свой собственный пользовательский тип (он определен в jni.h).

+0

Спасибо !! вы правы, он отлично работает с jlong! знак равно – user2340271

3

Или попробовать что:

#include <jni.h> 
#include <android/log.h> 

#define TAG "Java_my_package_MainActivity" 
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__) 

// ... 

JNIEXPORT void JNICALL Java_my_package_MainActivity_getDistance(JNIEnv *env, jobject obj, jlong a_id1, jlong a_id2){ 

    // ... 

    LOGI("ID1: %lu , ID2: %lu", a_id1, a_id2); 
} 
+1

при передаче окончательного тестаLong = 256L с Java, я обнаружил, что LOGI «% lu» печатает разные результаты из «% llu». Ответ @fadden может объяснить это. –

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