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