java如何在安卓 emulator上显示Mat图像?使用NDK
我想在安卓模拟器上显示Mat图像。我正在将assetManager从java
传递到c++
,并将图像作为资产加载。然后执行AAsset_读取,将图像数据保存到char*缓冲区中,并使用cv::imdecode
转换为Mat。
从这里开始,如何将Mat映像添加到模拟器
在默认的stringFromJNI
方法中,它们似乎使用return->envNewStringUTF(hello.c_str());
来显示文本:
Java_com_example_user_project_MainActivity_stringFromJNI(JNIEnv *env, jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
那么,我该如何使用Mat图像来实现这一点呢
编辑:这里是我的C++代码:JNIEXPORT jintArray JNICALL Java_com_example_user_activity_MainActivity_generateAssets(JNIEnv* env,jobject thiz,jobject assetManager) {
AAsset* img;
AAssetManager *mgr = AAssetManager_fromJava(env, assetManager);
AAssetDir* assetDir = AAssetManager_openDir(mgr, "");
const char* filename;
while ((filename = AAssetDir_getNextFileName(assetDir)) != NULL) {
AAsset *asset = AAssetManager_open(mgr, filename, AASSET_MODE_UNKNOWN);
if(strcmp(filename, "hi.jpg")==0 ) {
img = asset;
}
}
long sizeOfImg = AAsset_getLength(img);
char* buffer = (char*) malloc (sizeof(char)*sizeOfImg);
AAsset_read(img, buffer, sizeOfImg);
std::vector<char> data(buffer, buffer + sizeOfImg);
cv::Mat h = cv::imdecode(data, IMREAD_UNCHANGED);
jintArray resultImage = env->NewIntArray(h.total());
jint *_data = new jint[h.total()];
for (int i = 0; i < h.total(); i++) {
char b = h.data[4 * i];
char g = h.data[4 * i + 1];
char r = h.data[4 * i + 2];
char a = 255;
_data[i] = (((jint) a << 24) & 0xFF000000) + (((jint) r << 16) & 0x00FF0000) +
(((jint) g << 8) & 0x0000FF00) + ((jint) b & 0x000000FF);
}
env->SetIntArrayRegion(resultImage, 0, h.total(), _data);
delete[]_data;
return resultImage;
}
java代码:
assetManager = getAssets();
resultImage = generateAssets(assetManager);
Bitmap imageinjava = Bitmap.createBitmap(resultImage, 100,100, Bitmap.Config.ARGB_8888);
ImageView tv1;
tv1= (ImageView) findViewById(R.id.image);
tv1.setImageBitmap(imageinjava);
# 1 楼答案
要转换本地Mat图像,可以执行以下操作:
}
在你的java代码中
如果您想在C++和java之间传递本地的Mat对象,返回指针到您的Mat,并将其传递到本机函数;