将 mat 从 java 传递到 c++ jni android arm64-v8a 32/64 位
issue passing mat from java to c++ jni android arm64-v8a 32/64 bit
我在将 nativeobjectaddres 从 Java 传递到 c++ 时遇到问题。
这是我的 java 代码,findboardimage 是一个 C++ 方法:
Mat original = new Mat(), processed = new Mat(), res = new Mat();
Utils.bitmapToMat(bitmap[0], original);
if(original.channels()>4){
return null;
}
Logger.d("before native imagetype "+ original.type()+" imagedepth "+original.depth()+" imagechannels "+original.channels());
Logger.d("before address "+original.getNativeObjAddr() );
return findBoardInImage(original.getNativeObjAddr());
c++ 方法
JNIEXPORT void JNICALL Java_be_appwise_i3snap_1android_helpers_I3ImageProcessor_extractForeground(JNIEnv *env,jlong res) {
cv::Mat *resMat = (cv::Mat *) res;
__android_log_print(ANDROID_LOG_ERROR,"extractforeground ","voor eigen functie col %d rows %d");
*resMat=ImageProcessor::extractForeground(*resMat);
__android_log_print(ANDROID_LOG_ERROR,"extractforeground","na eigen functie col %d rows %d");
}
工作:
32 位 armeabi-v7a
oneplus x、一加一、三星 galaxy s4、sony experia m2 和一台旧三星平板电脑
不工作:
arm64-v8a
华为、三星 s6、nexus 6p
这个垫子有随机数的类型和随机数的通道,这让我相信 long 是 32 位,但被解释为 64 位,所以 getchannel 和 gettype 函数比它们应该的大得多。
我自己解决了在gradle中添加这个
我确实注意到一些性能问题。 64 位设备比 32 位设备慢得多。
ndk {
moduleName "ndksetup"
abiFilters "armeabi-v7a"
}
当您在 gradle 中导入库并且它包含 64 位版本时,它将忽略其他库的所有 32 位版本,这就是为什么我的 java 是 32 位而我的 c++ 试图理解的原因它作为 64 位
同时检查这个 link
Use Vuforia and io.realm db crash the app
我在将 nativeobjectaddres 从 Java 传递到 c++ 时遇到问题。
这是我的 java 代码,findboardimage 是一个 C++ 方法:
Mat original = new Mat(), processed = new Mat(), res = new Mat();
Utils.bitmapToMat(bitmap[0], original);
if(original.channels()>4){
return null;
}
Logger.d("before native imagetype "+ original.type()+" imagedepth "+original.depth()+" imagechannels "+original.channels());
Logger.d("before address "+original.getNativeObjAddr() );
return findBoardInImage(original.getNativeObjAddr());
c++ 方法
JNIEXPORT void JNICALL Java_be_appwise_i3snap_1android_helpers_I3ImageProcessor_extractForeground(JNIEnv *env,jlong res) {
cv::Mat *resMat = (cv::Mat *) res;
__android_log_print(ANDROID_LOG_ERROR,"extractforeground ","voor eigen functie col %d rows %d");
*resMat=ImageProcessor::extractForeground(*resMat);
__android_log_print(ANDROID_LOG_ERROR,"extractforeground","na eigen functie col %d rows %d");
}
工作: 32 位 armeabi-v7a oneplus x、一加一、三星 galaxy s4、sony experia m2 和一台旧三星平板电脑
不工作: arm64-v8a 华为、三星 s6、nexus 6p
这个垫子有随机数的类型和随机数的通道,这让我相信 long 是 32 位,但被解释为 64 位,所以 getchannel 和 gettype 函数比它们应该的大得多。
我自己解决了在gradle中添加这个 我确实注意到一些性能问题。 64 位设备比 32 位设备慢得多。
ndk {
moduleName "ndksetup"
abiFilters "armeabi-v7a"
}
当您在 gradle 中导入库并且它包含 64 位版本时,它将忽略其他库的所有 32 位版本,这就是为什么我的 java 是 32 位而我的 c++ 试图理解的原因它作为 64 位
同时检查这个 link Use Vuforia and io.realm db crash the app