2015年2月3日 星期二

從 C++ 中呼叫一個 Java 函数

//Qt - C++
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QScreen>
#include <QString>
#include <QUrl>
#include <QtQml>

QString TestStr(const QString &str)
{
    QAndroidJniObject string1 = QAndroidJniObject::fromString(str);

    QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod
                            ("com/kdab/training/MyJavaClass", // class name
                            "TestS", // method name
                            "(Ljava/lang/String;)Ljava/lang/String;", // signature
                            string1.object<jstring>());
    return data.toString();
}

int TestInt(int i)
{
    return QAndroidJniObject::callStaticMethod<jint>
                            ("com/kdab/training/MyJavaClass", // class name
                            "TestI", // method name
                            "(I)I", // signature
                            i);
}

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

    QString a=NULL;
    int b=0;

    a=TestStr("ooao");
    qDebug()<<"a="<<a;

    b=TestInt(777);
    qDebug()<<"b="<<b;

    return app.exec();
}
//MyJavaClass.java in com/kdab/traning
package com.kdab.training;  
   
public class MyJavaClass  
{  
    // this method will be called from C/C++  
    public static String TestS(String str)
   {  
        return "javaTestS="+str;
    }

    public static int TestI(int n)
    {
        return n*2+1;
    }
}
ref: 在软件开发的漫漫长路上且行且吟

signature稍微有一點複雜,例子如下
  • ()V,表示一個没有参數, 没有返回值的方法
  • (I)V:表示参數為一个int,没有返回值的方法
  • (I)I:表示参數為一個int,返回值為int的方法
  • (IF)Z:表示参數為一個int和一個float,返回值為boolean的方法
  • (Ljava/lang/String;)Ljava/lang/String;表示参數為一個string,返回值為string
ref: Here

沒有留言:

張貼留言