رفتن به مطلب
  • 0

استفاده از کدهای جاوا در ساخت کتابخانه با b4a


yaser_b4a

سوال

سلام

هنگام ساخت کتابخانه با b4a از کد های جاوا در پروژه کتابخانه میشه استفاده کرد؟

ظاهرا نمیشه و وقتی کتابخانه را در پروژه ای استفاده میکنم کد های جاوا انگار وجود ندارند:

Sub Class_Globals
	Dim jo As JavaObject
End Sub

Public Sub Initialize
	jo.InitializeContext
End Sub

Public Sub ParstoLong(str As String) As Long
	
	Return jo.RunMethod("stringToLong",Array As Object(str))
End Sub

#if java
import android.os.Bundle;

 public long  stringToLong(String str){
        long l = Long.parseLong(str.trim());
        return l;
    }
	
#end if

موقع استفاده از کتابخابه در یک پروژه خطای میده که تابع stringToLong پیدا نشد!

لینک ارسال
به اشتراک گذاری در سایت های دیگر

2 پاسخ به این سوال تاکنون داده شده است

ارسال های توصیه شده

در در 1396/05/25, 09:21:16، یاسر گفته است :

Public Sub Initialize

jo.InitializeContext

End Sub

در تکمیل صحبت های آقا محمدرضا. بجای این کد، این رو بذارید درست میشه داخل کلاس کتابخانتون:

jo=Me

:girl_blush:

لینک ارسال
به اشتراک گذاری در سایت های دیگر

ببینید هموطن دلیلش یه کم پیچیدس. من توضیح میدم. امیدوارم متوجه بشین.

شما وقتی این کتابخونه رو کامپایل کنید با بیسیک به صورت زیر تبدیل میشه به جاوا.


  public String _initialize(BA paramBA)
    throws Exception
  {
    innerInitialize(paramBA);
    
    this._jo.InitializeContext(this.ba);
    
    return "";
  }
  
  public long _parstolong(String paramString)
    throws Exception
  {
    return BA.ObjectToLongNumber(this._jo.RunMethod("stringToLong", new Object[] { paramString }));
  }
  
  public long stringToLong(String paramString)
  {
    long l = Long.parseLong(paramString.trim());
    return l;
  }
}

همونجور که میبینید تابع stringToLong به درستی وارد کلاس کتابخونه شده. خب پس مشکل چیه که خطا میگیره؟ 

مشکل اینجاست. کدهای تابع RunMethod  از کتابخونه javaobject رو ببینین کاملا متوجه میشین که چه خطایی موقع اجرای کتابخونه شما صورت میگیره.

  public Object RunMethod(String MethodName, Object[] Params)
    throws Exception
  {
    Class<?> cls = getCurrentClass();
    List<Method> mm = methodCache.getMethod(cls.getName(), MethodName, Params);
    Method method = null;
    for (Method m : mm)
    {
      Class[] mTypes = m.getParameterTypes();
      if (arrangeAndCheckMatch(mTypes, Params))
      {
        method = m;
        break;
      }
    }
    if (method == null) {
      throw new RuntimeException("Method: " + MethodName + " not matched.");
    }
    method.setAccessible(true);
    return method.invoke(getObject(), Params);
  }
  

به این خط توجه کنید 

 Class<?> cls = getCurrentClass();

کتابخونه جاوا آبجکت وقتی اینشیالایز میشه کلاسی که میگیره کلاسی نیست که توی کتابخونه هست. بلکه کلاسیه که توش کتابخونه شما تعریف میشه. مثلا توی اکتیویتی main کتابخونه رو اینشیالایز کردین. کلاسی که javaobject میگیره کلاس اکتیویتی main هست. خیلی بدیهیه که موقع اجرای RunMethod به خطای زیر بخورین

java.lang.RuntimeException: Method: stringToLong not found in: com.yourpackagename.main

چون توی کلاس main متدی که تو کتابخونه شما تعریف کردین وجود نداره.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

مهمان
این موضوع برای عدم ارسال قفل گردیده است.
  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...