Я новичок в «Qt для Android», и теперь я использую его для разработки программного обеспечения для мобильных устройств. Я разработал Java-функции, которые вызывают API-интерфейсы Android в виде класса в документе .java. Для упрощения пользовательского интерфейса При разработке пользовательский интерфейс основан на программе Qt Widget. Затем я использую класс Qt-JNI «QAndroidJniObject» для вызова этих функций Java в соответствии с документом API Qt5.2. Файл ресурсов Android хранится в каталоге: ./ android / src / com / comm / sipcall / SipCallSend.java. Поскольку в связи с этим было получено меньше информации, я разработал программу java и c ++ в соответствии с документом API. Но я столкнулся со следующими проблемами, а также надеюсь получить ответы:
1) Программа Qt основана на Qt Widget. Java-программе необходимо получить текущий объектный контекст приложения для инициализации java-объекта. Код на c ++, который я разработал следующим образом:
//c++:
QPlatformNativeInterface *interface = QApplication::platformNativeInterface();
jobject activity = (jobject)interface->nativeResourceForIntegration("QtActivity");
QAndroidJniObject* at = new QAndroidJniObject(activity);
QAndroidJniObject appctx = at->callObjectMethod("getApplicationContext","()Landroid/content/Context;");
//.pro:
QT += core gui gui-private
Это правильно?
2) Класс Java содержит функцию-конструктор и три открытые функции:
java:
package com.comm.sipcall;
improt XXXX
....
....
public class SipCallSend extends Activity {
private Context context; // 接收QT的context
public String sipToAddress = "";
public String sipDomain = "";
public String user_name = "";
public String pass_word = "";
public SipCallSend(){
Log.i("ddd","init");
sipToAddress = "";
sipDomain = "";
user_name = "";
pass_word = "";
}
public void SetContext(Context cnt)
{
this.context = cnt;
//Log.i("ccc",user_name);
}
public int Login(String domain,String username,String password){
....
sipDomain = domain;
user_name = username;
pass_word = password;
...
return 0;
}
public int Call(String addrNum) {
...
return 0;
}
}
C++:
QPlatformNativeInterface *interface = QApplication::platformNativeInterface();
jobject activity = (jobject)interface->nativeResourceForIntegration("QtActivity");
QAndroidJniObject* at = new QAndroidJniObject(activity);
QAndroidJniObject appctx = at->callObjectMethod("getApplicationContext","()Landroid/content/Context;");
QAndroidJniObject* m_sipcall = new QAndroidJniObject("com/comm/sipcall/SipCallSend");
if (!m_sipcall->isValid())
return;
m_sipcall->callMethod<void>("SetContext","(Landroid/content/Context;)V",
appctx.object<jobject>());
QAndroidJniObject domain = QAndroidJniObject::fromString("10.3.56.54");
QAndroidJniObject username = QAndroidJniObject::fromString("1006");
QAndroidJniObject password = QAndroidJniObject::fromString("1234");
jint res = m_sipcall->callMethod<jint>("Login","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
domain.object<jstring>(), username.object<jstring>(),password.object<jstring>());
if (res!=0)
return;
QAndroidJniObject addrNum = QAndroidJniObject::fromString("1018");
res = m_sipcall->callMethod<jint>("Call","(Ljava/lang/String;)I",addrNum.object<jstring>());
«Новый QAndroidJniObject» возвращает непустое значение, но следующие функции не могут выполняться, почему?
3) Я пытался сделать Context из c ++ как параметр функции конструктора, но я обнаружил, что код не работает, почему?
java:
public SipCallSend(Context cnt){
this.context = cnt;
}
C++:
QAndroidJniObject m_sipcall("com/comm/sipcall/SipCallSend","(Landroid/content/Context;)V",appctx.object<jobject>());
4) В соответствии с документом API Qt5.2, QAndroidJniObject предоставляет метод с именем «callObjectMethod»:
QAndroidJniObject myJavaString; ==> "Hello, Java"QAndroidJniObject mySubstring = myJavaString.callObjectMethod("substring", "(II)Ljava/lang/String;" 7, 10);
Но когда я использую его следующим образом, IDE подсказывает, что параметры неверны, почему?
jint res = m_sipcall->callMethod<jint>("Login","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
domain.object<jstring>(), username.object<jstring>(),password.object<jstring>());
Спасибо…
Задача ещё не решена.
Других решений пока нет …