如何用Qt打开Android图像库

        本文讲述如何用Qt和AndroidJava混合代码打开Android默认图像库。如果你从事图像处理工作的话,该文档相当有用。例如,用imread函数打开一幅OpenCV Mat图像或者写一些图片浏览程序。很遗憾,Qt还没有默认提供这项功能,所以我想把它分享给大家。


在此,我假设你已经聚币如下条件:

    *你已经成功在你的电脑上安装了Qt(带Android环境)

    *你有一台Android手机或者模拟器来跑Qt Android程序

#功能

本工程示例可以打开Android图库中的图片并显示到QLabel widget上。下面的截屏显示了Qt工程调用QtAndroidGallery,在后面的代码部分贴出了技术细节。

如何用Qt打开Android图像库_第1张图片


注意:本工程(源码)同样可以用于我前面写的一篇文章《如何用Qt(C++)和Android混合编程》

工程做了什么?

简单涵盖了Qt(C++)和Android(Java)通过JNI(Java Native Interface)代码的交互

详解:

下面我讲解释部分代码片段,可能会有点儿绕,如果您有关于本项目任何疑问或者遇到任何相关构建或运行问题请在讨论区提问讨论。



本方法用来抽取在图像库中选择的文件名。注意,下列JNI接口代码名的抽取样式非常重要。域名、报名、Java类名和方法名都必须用“_”隔开,如下所示。

JNIEXPORT void JNICALL
Java_com_amin_QtAndroidGallery_QtAndroidGallery_fileSelected(JNIEnv */*env*/,
jobject /*obj*/,
jstring results)
{
selectedFileName = QAndroidJniObject(results).toString();
}



本段代码用来调用Java代码中的静态方法。“openAnImage”是带一个参数的Java方法,返回选择的文件名。

QAndroidJniObject::callStaticMethod(“com/amin/QtAndroidGallery/QtAndroidGallery”,
“openAnImage”,
“()V”);

我们不深入到Java代码的细节中去,但是很多时候我发现在网上很多人难以理解如何调从一个内部的静态方法中用一个非静态方法。其实很简单!首先像这样在方法内部创建一个相同的类的实例(示例代码中已经有了)

private static QtAndroidGallery m_instance;
public QtAndroidGallery()
{
m_instance = this;
}

然后,插入那个静态方法,用你创建的类的实例调用非静态方法!

static void openAnImage()
{
m_instance.dispatchOpenGallery();
}

我不会讨论“dispatchOpenGallery”方法的细节,因为都是些纯Android代码,你只需要简单的使用Android SDK文档来获取相关的更多信息。


                                                                                                                                                                                                                                                                        


你可以从这里下载示例代码的源程序。包含了程序运行所有需要的文件,只要你正确配置了Qt的Android开发环境就好了。

本文翻译自http://amin-ahmadi.com/2015/12/08/how-to-open-android-image-gallery-in-qt/

请大家尊重作者的版权


你可能感兴趣的:(如何用Qt打开Android图像库)