ورود

View Full Version : سوال: صدا زدن تابع جاوا در Qt



returnx
جمعه 10 مرداد 1393, 15:54 عصر
من یک کلاس جاوا ساختم به این صورت :
import org.qtproject.example;
import java.util.List;
import android.app.Activity;
import android.content.Context;


public class test_class extends org.qtproject.qt5.android.bindings.QtActivity {

public static int test()
{
return 5;
}

}//End Class



و بعد یک کلاس Cpp که با استفاده از QtAndroidExtras متد بالا را صدا میزنم به این صورت :
#include "jwifi.h"
#include <QtAndroidExtras/QAndroidJniObject>
#include <QtAndroidExtras/QAndroidJniEnvironment>
#include "jni.h"
#include <QStringList>
#include <QString>


jwifi::jwifi(QObject *parent) :
QObject(parent)
{
}


int jwifi::test()
{
jint result = QAndroidJniObject::callStaticMethod<jint> ("org/qtproject/example/test_app/test_class","test");
int temp= int (result);
return temp;
}
حالا وقتی از main متد test کلاس jwifi را صدا میزنم برنامه بدون خطا کامپایل میشه اما همیشه مقدرا خروجی برای 0 هست در حالی که انتظار میره 5 باشه!

kitten
جمعه 10 مرداد 1393, 22:15 عصر
توی کیوت نسخه ۵.۳ را تست نکردم ولی تو نسخه های پایین تر باید متد onload را بازنویسی می کردی و تابع جاوا تو register می کردی
فک کنم شما این کار را نکرده اید
کلا به این کار می گن jni که مخفف java native interface هستش فک کنم
لینک زیر یه نمونه مثال هستش که من خودم هم ازین روش بارها رفتم ولی از خود کلاس QAndroidjni تاا حالا استفاده نکردم جون اخیرا تو نسخه آخر اینو اضافه کردند و تو نسخه های ۵ تا ۵.۲ نبود تا انجا که یادمه.
واسه همین من روش قدیمی استفاده میکنم
البته فک کنم QAndroidJni هم میاد همون متد onload را بازنویسی می کنه
https://community.kde.org/Necessitas/JNI

kitten
جمعه 10 مرداد 1393, 22:16 عصر
توی کیوت نسخه ۵.۳ را تست نکردم ولی تو نسخه های پایین تر باید متد onload را بازنویسی می کردی و تابع جاوا تو register می کردی
فک کنم شما این کار را نکرده اید
کلا به این کار می گن jni که مخفف java native interface هستش فک کنم
لینک زیر یه نمونه مثال هستش که من خودم هم ازین روش بارها رفتم ولی از خود کلاس QAndroidjni تاا حالا استفاده نکردم جون اخیرا تو نسخه آخر اینو اضافه کردند و تو نسخه های ۵ تا ۵.۲ نبود تا انجا که یادمه.
واسه همین من روش قدیمی استفاده میکنم
البته فک کنم QAndroidJni هم میاد همون متد onload را بازنویسی می کنه
https://community.kde.org/Necessitas/JNI

returnx
شنبه 11 مرداد 1393, 13:34 عصر
تابع جاوا تو register می کردی
دقیقا به چه شکل باید این کارُ انجام داد!؟

kitten
شنبه 11 مرداد 1393, 22:41 عصر
یه نگاه به سازنده کلاس SimpleAndroidMediaPlayer و این مخربش همچنین متد استاتیک

JNIEXPORT jint JNI_OnLoad(JavaVM* vm,void*/*reserved*/)

بنداز مشخصه
ببین چطوری متدهای کلاس SimpleAndroidMediaPlayer را در متد استاتیک بالا رجیستر کرده
https://community.kde.org/Necessitas/JNI