我正在尝试在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;
}
答案 0 :(得分:2)
Main.c
应该包含func.h
,否则main.c
认为getMyDouble()
会返回int
。