就我而言。最好的也是唯一实用的方法是使用 Jni。乍一看似乎很混乱,但如果你有一点 java 经验,你肯定可以做到。
要将文本发送到另一个应用程序,如 facebook,我们应该使用 Intents。所以我们可以简单地在一个简单的 Java 文件中完成这项工作,并使用 Jni 从 c++ 端调用它。这是 SendIntent.java 文件的内容。该类有一个静态成员函数,它提供上下文并启动 Intent。然后它将文本数据发送到新活动。
package com.example.android.tools;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
public class SendIntent {
public static void sendText(Activity context,String text) {
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, text);
sendIntent.setType("text/plain");
context.startActivity(Intent.createChooser(sendIntent, text));
}
}
所以在 c++ 端,我们只需要启动一个 android 活动并将其传递给这个类: 这是 c++ 代码:
void example::shareText(QString str)
{
QAndroidJniEnvironment _env;
QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); //activity is valid
if (_env->ExceptionCheck()) {
_env->ExceptionClear();
throw InterfaceConnFailedException();
}
if ( activity.isValid() )
{
QAndroidJniObject::callStaticMethod<void>("com/example/android/tools/SendIntent","sendText","(Landroid/app/Activity;Ljava/lang/String;)V",activity.object<jobject>(),QAndroidJniObject::fromString(str).object<jstring>());
if (_env->ExceptionCheck()) {
_env->ExceptionClear();
throw InterfaceConnFailedException();
}
}else
throw InterfaceConnFailedException();
}
如果您担心跨平台问题,您可以使用预处理器指令编写平台相关代码,这是 C++ 编程中非常常见的解决方案。
我应该提到的最后一件事是将这些代码行添加到 .pro 文件中。所以qt也能找到java资源:
android {
QT += androidextras
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources
}
在这种情况下,android-sources 是我放置所有 java 源的目录。