我有一个带有大型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位桌面。
我错过了一些必要的东西吗?
答案 0 :(得分:1)
找到解决我问题的方法:
数据类型大小在64位上是不同的,所以我的库期望4个字节,但long是8个字节(编译为32位时为4个字节)。将它们拼凑到uint32_t就可以了。
普通int工作,因为默认情况下为4个字节。