64位Android编译,但在运行时有问题

时间:2015-02-19 00:39:24

标签: c++ android-ndk 64-bit

我有一个带有大型C ++库的Android应用程序,在编译为

时可以顺利运行
APP_ABI := armeabi-v7a  //32 bit

但在使用

编译时出现问题
APP_ABI := arm64-v8a   //64 bit

根据NDK文档,所有JNI jint变量都已转换为jlong​​变量。

我的问题是,由于某些原因,当从函数变量赋值时,我无法比较除int之外的任何数据类型的变量。

这有效:

unsigned long a = 200;
unsigned long b = 200;
if(a == b) {
    LOGE("got here"); //This works
}

这失败了:

void myClass::MyFunction(unsigned long c, unsigned long d) {
    if(c == d) {
        LOGE("got here"); //This does NOT work
    }
}

请注意,上述两个函数都在32位版本中工作。记录时,我从变量c和d读取的值是相同的。

有趣的是,这适用于64位版本(int变量):

void myClass::MyFunction(int e, int f) {
    if(e == f) {
        LOGE("got here"); //This works
    }
}

只能比较整数。我尝试了长,双,长,未签名和签名......

我的NDK版本是10d(​​最新)。我尝试了两种,NDK的32位和64位版本,结果是一样的。我的开发平台是Win7 64位桌面。

我错过了一些必要的东西吗?

1 个答案:

答案 0 :(得分:1)

找到解决我问题的方法:

数据类型大小在64位上是不同的,所以我的库期望4个字节,但long是8个字节(编译为32位时为4个字节)。将它们拼凑到uint32_t就可以了。

普通int工作,因为默认情况下为4个字节。