Android NDK传递长整型值给本地方法

3
这是我的函数:
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;

因为我有一些大于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);

日志输出为:

ID1: 1234, ID2: 0

我总是得到ID2 = 0!我不知道为什么第二个参数总是评估为0!

2个回答

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
当我从Java传递一个final testLong = 256L时,我发现LOGI“%lu”打印的结果与“%llu”不同。@fadden的答案可能可以解释这个问题。 - RoundSparrow hilltx

2
您的 sprintf 需要使用 %llu 来打印64位的数据,而不是用 %u。我认为您其实已经通过JNI得到了正确的值,但是因为 被告知期望两个32位的值并且正在打印第一个参数的高字,所以结果有误。
此外,在JNI声明中,您应该使用jlong而不是自定义类型(它在 jni.h 中被定义)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接