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

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

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

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

long int getMyLong(){ return 0x1122334455667788;}

有趣的是,如果在 main.c 中定义了从 func.c 调用函数的桥接函数,它返回的只是看起来是 32 位的部分,而如果我直接从桥接函数返回值,它就可以工作 double 也是如此

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 
    }


编辑2:
关于构建配置和 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 生成的文件

主.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);
  } 

函数.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

函数.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;
}    

最佳答案

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

关于java - android NDK 函数返回 64 位变量的错误值(double,long int),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26607354/

相关文章:

java - 给定一个自然数 N,找出不大于 N 且单调非递减数字的最大数

java - ProcessBuilder启动java程序: IOException.无法启动进程。原因:无法运行程序CreateProcess error=2

java - 循环内更新时仅显示一次提示

java - 是否建议每次在运行 jps 之前格式化 namenode?

c++ - 如何在 OpenGL 中使用 glOrtho()?

Eclipse 上的 Android 在调试时遵循正确的 Android 源代码版本

Android:AsyncTask 的优先级高于 Service

android - - 类型 'GoogleServicesTask' 字段 'intermediateDir' 没有相应的 getter 已用 @OutputDirectory 注释

c - 命名空间和 extern 'C' 编译错误

c - 如何从 c 中的两个(纯文本)文件中的两个元素创建字符串?