将Mat传递给JNI函数-OpenCV
Pass Mat to JNI function - OpenCV
我试图使用jlong
通过JNI函数传递Mat
对象,但在运行时遇到了以下异常:
(__gnu_cxx::__verbose_terminate_handler()+276)
(__cxxabiv1::__terminate(void (*)())+8)
(std::terminate()+20)
(__cxa_throw+148)
(cv::error(cv::Exception const&)+80)
(cv::Mat::copySize(cv::Mat const&)+18)
(cv::Mat::Mat(cv::Mat const&)+122)
(cv::_InputArray::getMat(int) const+252)
(cv::split(cv::_InputArray const&, cv::_OutputArray const&)+20)
(cv::split(cv::Mat const&, std::vector<cv::Mat, std::allocator<cv::Mat> >&)+28)
(cv::xphoto::balanceWhite(cv::Mat const&, cv::Mat&, int, float, float, float, float)+54)
(Java_com_myapp_camera_CameraManager_simpleWhiteBalance+18)
本机函数定义如下
public native static void simpleWhiteBalance(Mat source, Mat dest);
它以以下方式实现
#include <jni.h>
#include <opencv2/core/core.hpp>
#include "opencv2/xphoto.hpp"
#include "simple_color_balance.cpp"
#include "com_myapp_camera_CameraManager.h"
JNIEXPORT void JNICALL Java_com_myapp_camera_CameraManager_simpleWhiteBalance
(JNIEnv *, jclass, jlong in, jlong out) {
cv::Mat& inMat = *(cv::Mat*)in;
cv::Mat& outMat = *(cv::Mat*)out;
cv::xphoto::balanceWhite(inMat, outMat, cv::xphoto::WHITE_BALANCE_SIMPLE);
}
我是C++的新手,这个异常是什么意思?
jlong
不是映射对象,而是映射long
(对象映射为jobject
),并且Mat
的Java实例与cv::Mat
的实例完全不同,不能以这种方式进行强制转换。这里的常用方法是在Java中使用long
s作为C++中指针的近似值,并按照您使用的方式进行强制转换。
此外,这不是一个异常,而是由未捕获的异常引起的崩溃。要获得异常,您需要在C++代码中使用try-catch。C++异常与Java异常不兼容,因此您不能在Java中抛出C++并捕获它,反之亦然。
cv::Mat *inMat = (cv::Mat*)in;
cv::Mat *outMat = (cv::Mat*)out;
并且请传递指针而不是引用。参见示例
相关文章:
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- Android JNI RegisterNatives:对所有内容调用一次,或者每个函数调用一次
- 无法使用 JNI 从C++模块成功调用 Java 函数
- JNI C FindClass函数返回null
- 从 Android JNI/NDK 代码中的C++函数调用 C 函数
- 如何从 JNI 传递 std::list 参数来调用本机 C++ 函数
- 在Android Studio JNI函数中使用jint和jstring
- Android JNI不舒服的Linkerror函数名称
- 在创建新对象时,尝试将参数提供给JNI对象的构造函数时会出现错误
- 如何使用JNI将数据传递到构造函数
- 从WordCount Hadoop示例调用Helloworld Jni函数,给出错误Java.lang.unsatisf
- 在哪里可以获得 Android Studio NDK 的 JNI 函数的完整列表
- 将Mat传递给JNI函数-OpenCV
- 将 OpenCV 轮廓从 JNI C++ 函数传递到 Android 中的 Java
- 使用 C++ 模板生成 JNI 函数
- 在哪里可以学习JNI函数的用法
- JNI函数调用上的ClassCastException:CallVoidMethod
- 如何为<Point> jni C++函数传递 ArrayList?
- JNI函数中的两个整数和返回错误的值
- JNI函数返回的字符串被垃圾收集