qt for Android如何接收String类型的返回值

晨曦呢 2014-07-15 05:15:33
我在调用java的时候,需要它返回String类型的返回值,在我的.cpp中应该如果调用《用一下这个函数》:
jint Flags = QAndroidJniObject::callStaticMethod<jint>("org/qtproject/example/notification/Test","test", "(II)I", a, b);
这个是int型的,可以接收到返回值,String类型的应该怎么弄啊;
...全文
329 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lijun_ay 2014-09-15
  • 打赏
  • 举报
回复
请问楼主如何解决的?
寒山-居士 2014-07-16
  • 打赏
  • 举报
回复
晨曦呢 2014-07-16
  • 打赏
  • 举报
回复
引用 7 楼 Esonpo 的回复:
[quote=引用 5 楼 BXport 的回复:] [quote=引用 4 楼 Esonpo 的回复:] 参考下
// C++ code
QAndroidJniObject string1 = QAndroidJniObject::fromString("String1");
QAndroidJniObject string2 = QAndroidJniObject::fromString("String2");
QAndroidJniObject stringArray = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/TestClass",
                                                                          "stringArray"
                                                                          "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"
                                                                           string1.object<jstring>(),
                                                                           string2.object<jstring>());
QAndroidJniObject::callStaticObjectMethod这个是可以的,但是QAndroidJniObject::callStaticMethod这个不行,不知道哪儿的问题[/quote] 你可以参考下这个
#include <QApplication>
#include <QTranslator>
#include <QString>

#include <jni.h>

JavaVM* javaVM = NULL;

// JNI_OnLoad called after VM is initialized
Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* /*reserved*/)
{
javaVM = vm; // save pointer
return JNI_VERSION_1_6;
}

Q_DECL_EXPORT int main(int argc, char *argv[])
{
QApplication app(argc, argv);

// getting JNIEnv object from Java VM
JNIEnv* env;
if (javaVM->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return -1;
}

// Java class, that can get Local information
const char* QtActivityclassName = "java/util/Locale";
jclass clazz=env->FindClass(QtActivityclassName);
jmethodID constr = env->GetStaticMethodID(clazz, "getDefault", "()Ljava/util/Locale;");
// calling static method - getDefault() - getting java.util.Locale object	
jobject obj1 = env->CallStaticObjectMethod(clazz,constr);
jclass appClass1 = env->GetObjectClass(obj1);
constr = env->GetMethodID(appClass1, "getLanguage", "()Ljava/lang/String;");
// calling method of java.util.Locale object - getLanguage() 
jstring result = (jstring)env->CallObjectMethod(obj1, constr);
// converting jstring to QString
const char *strResult = env->GetStringUTFChars( result, 0 );
QString str(strResult);
env->ReleaseStringUTFChars( result, strResult);

QTranslator myappTranslator;
// taking .qm file from resource
myappTranslator.load(":/MyAppName_" + str);
app.installTranslator(&myappTranslator);

return app.exec();
}
[/quote]恩,已经解决了,可以返回jstring了
寒山-居士 2014-07-16
  • 打赏
  • 举报
回复
引用 5 楼 BXport 的回复:
[quote=引用 4 楼 Esonpo 的回复:] 参考下
// C++ code
QAndroidJniObject string1 = QAndroidJniObject::fromString("String1");
QAndroidJniObject string2 = QAndroidJniObject::fromString("String2");
QAndroidJniObject stringArray = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/TestClass",
                                                                          "stringArray"
                                                                          "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"
                                                                           string1.object<jstring>(),
                                                                           string2.object<jstring>());
QAndroidJniObject::callStaticObjectMethod这个是可以的,但是QAndroidJniObject::callStaticMethod这个不行,不知道哪儿的问题[/quote] 你可以参考下这个
#include <QApplication>
#include <QTranslator>
#include <QString>

#include <jni.h>

JavaVM* javaVM = NULL;

// JNI_OnLoad called after VM is initialized
Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* /*reserved*/)
{
javaVM = vm; // save pointer
return JNI_VERSION_1_6;
}

Q_DECL_EXPORT int main(int argc, char *argv[])
{
QApplication app(argc, argv);

// getting JNIEnv object from Java VM
JNIEnv* env;
if (javaVM->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return -1;
}

// Java class, that can get Local information
const char* QtActivityclassName = "java/util/Locale";
jclass clazz=env->FindClass(QtActivityclassName);
jmethodID constr = env->GetStaticMethodID(clazz, "getDefault", "()Ljava/util/Locale;");
// calling static method - getDefault() - getting java.util.Locale object	
jobject obj1 = env->CallStaticObjectMethod(clazz,constr);
jclass appClass1 = env->GetObjectClass(obj1);
constr = env->GetMethodID(appClass1, "getLanguage", "()Ljava/lang/String;");
// calling method of java.util.Locale object - getLanguage() 
jstring result = (jstring)env->CallObjectMethod(obj1, constr);
// converting jstring to QString
const char *strResult = env->GetStringUTFChars( result, 0 );
QString str(strResult);
env->ReleaseStringUTFChars( result, strResult);

QTranslator myappTranslator;
// taking .qm file from resource
myappTranslator.load(":/MyAppName_" + str);
app.installTranslator(&myappTranslator);

return app.exec();
}
寒山-居士 2014-07-16
  • 打赏
  • 举报
回复
jclass javaMathClass = ...; // ("java/lang/Math") jint a = 2; jint b = 4; jint max = QAndroidJniObject::callStaticMethod<jint>(javaMathClass, "max", "(II)I", a, b); 比如返回jstring = QAndroidJniObject::callStaticMethod<jstring >(javaMathClass, "max", "(II)I", a, b); 这个呢?
晨曦呢 2014-07-16
  • 打赏
  • 举报
回复
引用 4 楼 Esonpo 的回复:
参考下
// C++ code
QAndroidJniObject string1 = QAndroidJniObject::fromString("String1");
QAndroidJniObject string2 = QAndroidJniObject::fromString("String2");
QAndroidJniObject stringArray = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/TestClass",
                                                                          "stringArray"
                                                                          "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"
                                                                           string1.object<jstring>(),
                                                                           string2.object<jstring>());
QAndroidJniObject::callStaticObjectMethod这个是可以的,但是QAndroidJniObject::callStaticMethod这个不行,不知道哪儿的问题
寒山-居士 2014-07-16
  • 打赏
  • 举报
回复
参考下
// C++ code
QAndroidJniObject string1 = QAndroidJniObject::fromString("String1");
QAndroidJniObject string2 = QAndroidJniObject::fromString("String2");
QAndroidJniObject stringArray = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/TestClass",
                                                                          "stringArray"
                                                                          "(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"
                                                                           string1.object<jstring>(),
                                                                           string2.object<jstring>());
寒山-居士 2014-07-16
  • 打赏
  • 举报
回复
以此类推 不行吗?
晨曦呢 2014-07-16
  • 打赏
  • 举报
回复
还是没有人进来看看吗?
晨曦呢 2014-07-15
  • 打赏
  • 举报
回复
没人来看看吗?求指点啊

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧