gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:22:37 24 4
gpt4 key购买 nike

我试图在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com