将mat从java发送到c++;jni安卓arm64-v8a 32/64位 我有一个问题,把java的nAbjutAdvices从C++传递到C++。 这是我的java代码,FiffdMaGeD是一个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());

将mat从java发送到c++;jni安卓arm64-v8a 32/64位 我有一个问题,把java的nAbjutAdvices从C++传递到C++。 这是我的java代码,FiffdMaGeD是一个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());,java,android,c++,android-ndk,java-native-interface,Java,Android,C++,Android Ndk,Java Native Interface,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 ","voo

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、one plus one、三星galaxy s4、索尼experia m2和一台旧三星平板电脑

不工作: arm64-v8a 华为、三星s6、nexus 6p


这个mat有随机数的类型和随机数的通道,这让我相信long是32位的,但被解释为64位的,因此getchannel和gettype函数比它们应该的大得多。

我自己解决了它,在gradle中添加了这个 我确实注意到一些性能问题。64位设备的速度比32位设备慢得多

 ndk {
        moduleName "ndksetup"
        abiFilters "armeabi-v7a"
    }
当你在GrADLE中导入库并且包含64位版本时,它将忽略所有其他32个版本的库,这就是为什么我的java是32位,而C++试图理解它为64位

也请检查此链接

嘿,伙计们,我解决了。