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

标签 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);
    }
}

最佳答案

Java 中的

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

在 C 中,使用 jlong​​ 而不是 long,它被定义为足够长的整数数据类型。

关于java - 为什么 C 函数不能将正确的参数传递给 java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18801441/

相关文章:

android - React native 0.61.5 Crashlytics 缺少 libhermes.so : SoLoader. java com.facebook.soloader.SoLoader.assertInitialized

android - 无法使用 Android Studio 覆盖 view.View 方法

c - 如何将 strcat 与未指定长度的 char* 一起使用

java - Groovy:以 Maps 作为键的 MultiValueMap

解析大型 xml 文件时发生 Java 堆空间错误

java - Android 抽屉布局未显示

java - 如何在没有主线程或 Activity 的情况下从服务调用 Speechrecognizer 方法

c - 汇编代码 : logic behind calculating offset into stack

c - 更新链接列表顶部条目

java - 没有文件选择器的webview从输入字段打开相机