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);

logcat 中的输出是:

ID1: 1234, ID2: 0

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

4

2 回答 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);
}
于 2014-02-03T09:23:44.607 回答
2

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

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

于 2013-05-02T00:02:25.020 回答