2013-05-01 51 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 ... 
    } 

龍是一種類型定義:

typedef long long Long; 

因爲我有一些值是磨碎機比爲int的最大值在我的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位值,並且正在打印第一個參數的高位字。

此外,您應該在JNI聲明中使用jlong,而不是您自己的自定義類型(它在jni.h中定義)。

+0

謝謝!你是對的,它與jlong​​一起工作得很好! =)。 – user2340271 2013-05-02 20:04:32

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

當從Java傳遞最終的testLong = 256L時,我發現LOGI「%lu」打印出「%llu」的不同結果。 @fadden的答案可能會解釋這一點。 – 2016-10-22 14:40:28