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 个字节。
我有一个带有大型 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 个字节。