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

64 Bit Android compiling but has problems at runtime

我有一个带有大型 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
    }
}

只能比较整数。我试过 long, double, long long, unsigned 和 signed...

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

我是不是漏掉了一些重要的东西?

找到了我的问题的解决方案:

64 位上的数据类型大小不同,因此我的库需要 4 个字节,但 long 为 8 个字节(为 32 位编译时为 4 个字节)。将它们强制转换为 uint32_t 就成功了。

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