Android NDK将长值传递给本机方法

时间:2013-05-01 17:33:08

标签: android parameters android-ndk native long-integer

这是我的功能:

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是一种类型def:

typedef long long Long;

因为我有一些比int type

的最大值更大的值

在我的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 个答案:

答案 0 :(得分:4)

或尝试:

#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 :(得分:2)

您的sprintf需要使用%llu来打印64位数量而不是%u。我相信你实际上是通过JNI获得了正确的值,但是sprintf调用被告知期望两个32位值并且正在打印第一个参数的高位字。

此外,您可能应该在JNI声明中使用jlong而不是您自己的自定义类型(它在jni.h中定义)。