为什么C函数不能将正确的参数传递给java?

时间:2013-09-14 11:49:18

标签: java android c java-native-interface

在我的测试中,我想从C调用Java并传递long类型参数,当我使用long类型时,在Java方法中,传入的参数无法正确获取,它总是4294967297.但是当我尝试使用int类型时,一切都很好。有人知道什么是错的吗?

JAVA:

public static void test(long num) {
    Log.d("test", "xxxxxxxxxxx:%ld" + String.valueOf(num));
}

C:

void test_jni()
{
    long num = 5000;
    jclass theClass = (*currentJNIEnv)->FindClass(currentJNIEnv, "me/example/something/TestClass");
    if (NULL != theClass) {
        jmethodID mid = (*currentJNIEnv)->GetStaticMethodID(currentJNIEnv, theClass, "test", "(J)V");
        if (mid == 0) return;
        (*currentJNIEnv)->CallStaticVoidMethod(currentJNIEnv, theClass, mid, num);
    }
}

2 个答案:

答案 0 :(得分:6)

Java中的

long始终是64位整数类型,C中的long可能是32位整数类型(至少在x86 32位linux上)。所以他们是不同的。这就是为什么你会得到垃圾。

在C中,使用jlong而不是long,{type}}是一个足够长的整数数据类型。

答案 1 :(得分:2)

有一个typedef“jlong​​”来表示Java long;使用它代替“long”来声明参数。它可能与您系统上的长度不同。