【问题标题】:Android NDK passing long values to native methodAndroid NDK 将长值传递给本机方法
【发布时间】:2013-04-25 18:03:03
【问题描述】:

这是我的功能:

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 !

【问题讨论】:

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


    【解决方案1】:

    或者试试:

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

    【讨论】:

    • 当从 Java 传递一个最终的 testLong = 256L 时,我发现 LOGI "%lu" 从 "%llu" 打印不同的结果。 @fadden 的回答可以解释这一点。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 2012-12-26
      • 2017-03-11
      • 1970-01-01
      相关资源
      最近更新 更多