如何用Qt和Java代码进行混合编程(在Qt for Anroid环境下)

Qt提供Android应用中写Java代码的功能。这就像人们用Android Studio(或者Eclipse等)开发Android应用程序时可用写C++程序一样。默认情况下,Qt只能用Qt提供的模块(大多数情况下已经够用了)写C++程序。但是,在一些特定的情况下你需要用到一些Android API,而Qt有没有提供。一个典型的例子,调用Android默认图库来打开一张图片,或语言合成等你所能想到的应用。如果你在写Android App的时候不想受到这些Qt提供功能的限制,那么请跟我一步一步的学习如何在你的Qt项目中加入Java程序。


注意:我假设你的电脑上已经安装了Qt的Android开发环境

  ·  首先创建一个Qt Widgets应用程序,讲Android构建工具设置成你的构建工具。(你可以设置成x86作为模拟器调试也可以设置成armeabi-v7a进行真机调试)。

  ·  在你的.pro项目文件中加入下列配置代码。(插入到你想插入的任何地方,但是我推荐你插入到.pro文件的末尾)

ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources

  ·  现在你可以下载并解压zip文件,拷贝到你的工程目录中,并添加解压后的文件到你的项目中,右键点击你的项目并选择“添加已有文件” 

下载源码



zip文件中有这样两个文件

android-sources/AndroidManifest.XML

android-sources/com/mycompany/myappname/myappname.JAVA

  ·  现在可以在上述Java文件写Android代码了(假设你已经很熟悉Java代码了)。Java和Qt(C++)之间传递结果需要用到JNI。你可以在网上搜索有关JNI的信息来熟悉JNI,它是Qt(C++)与Android(Java)之间的接口程序。


  ·  你可以在你的MainWindow.cpp文件或者其他任何需要访问Java方法的源文件中像这样定义方法。在这里,假设在你的Java代码中有一个名叫“somefunction”的方法要返回String值:

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

就像Qt 文档中描述的那样,你需要在你的代码中引入下列头文件来允许上文代码中的函数定义:

添加如下头文件:

#include 

添加模块到项目文件.pro:

QT += androidextras

最后,非常重要的一点是“mycompany”,“myappname”和其他本手册中用到的名称必须确保它们在你的整个项目中保持一致。显然可以把它们改成任意你或者你的项目的名称,但是你必须在“AndroidManifest.XML”中同步的修改,在Java代码中、C++代码中也一样,将文件夹名改成“Android-source”等(如果你要引用本demo的话)。你必须保持他们的一致性,否则程序可能会崩溃!

在未来的一段时间内我将陆续多写一些手册来讲述在Qt项目中使用Android特定代码的方法,同时,也欢迎大家在讨论区提交你们遇到的任何问题。


你可能感兴趣的:(Qt交叉编译环境)