将 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