android NDK函数返回64bits变量的错误值(double,long int)

时间:2014-10-28 11:36:58

标签: java android c android-ndk java-native-interface

我正在尝试在android studio中处理android NDK,我设置了一个带有所需文件的jni文件夹的演示应用程序,当我调用返回int或const char的函数时,它似乎按预期工作*,但是当谈到双打时,它只是表现不好。
我试图将返回的值转换为jdouble,并尝试将函数声明为返回一个long double,结果相同。该应用程序运行在一个nexus 5上,我不知道出了什么问题 根据要求,这里有几个尝试,左边是c中的return语句,右边是java中的值 返回0 - > 0
返回1 - > 0
返回1.555 - > -1.374389535E9
返回10 - > 0
返回10.555 - > -1.71798692E8
返回2000 - > 0
return 2000.123 - > -2.0615843E8
好吧,似乎整数值返回0 ...?

修改:
我添加了一个新函数getMyLong,与其他函数一样

long int getMyLong(){ return 0x1122334455667788;}

有趣的是,如果在main.c中定义了桥接函数,从func.c调用函数,它返回的似乎是32位部分,而如果我直接从桥函数返回值,它的工作原理所以它与双打

JNIEXPORT jlong JNICALL Java_com_lelloman_jni_1test_MainActivity_getMyLong
    (JNIEnv * env, jobject obj){
          return getMyLong(); // this one will return 1432778632 in java
          //return 0x1122334455667788; this one returns 1234605616436508552 
    }


EDIT2
关于构建配置和ndk,我几乎不知道我在做什么,但我会尽力指出我所知道的:
- 在local.properties中我添加了这一行ndk.dir=/usr/share/android-studio/data/ndk
- 在ndk / RELEASE.TXT中说r10c (64-bit) - 在build.gradle中我在defaultConfig中添加了这个(我也试过没有cFlags,它是一样的)

ndk {
    moduleName "ndkTest"
    cFlags "-std=c99"
}

- javah生成了一个名为com_lelloman_jni_test_MainActivity.h的文件,唯一包含#include <jni.h>的文件 - 我写了main.c,唯一包含的是用javah生成的文件

main.c中

#include "com_lelloman_jni_test_MainActivity.h"

JNIEXPORT jint JNICALL Java_com_lelloman_jni_1test_MainActivity_getMyInt
  (JNIEnv * env, jobject obj, jint b, jint h){
        return getMyInt( b, h);
  }    
JNIEXPORT jdouble JNICALL Java_com_lelloman_jni_1test_MainActivity_getMyDouble
  (JNIEnv *env, jobject obj, jdouble r){
        return getMyDouble(r);
  } 

func.h

#ifndef FUNC_H_INCLUDED
#define FUNC_H_INCLUDED


int getMyInt(int b,int h);
double getMyDouble(double r);
const char* getMyString(int q);

#endif // FUNC_H_INCLUDED

func.c

#include "func.h"

#ifndef PI
#define PI 3.14159265359
#endif // PI


int getMyInt(int b,int h){
    return b*h;
}

double getMyDouble(double r){
    //return r*PI*2;
    //return 5;
    return 1*2.23;
}    

1 个答案:

答案 0 :(得分:2)

Main.c应该包含func.h,否则main.c认为getMyDouble()会返回int