الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مطلوب شرح كود لجزء من برنامج مفتوح المصدر

بدأه mohamed_rw في 25 فبراير 2014 · 5 رد · 947 مشاهدة · في Android
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله الله وبركاته
انا اخوكم محمد من سوريا طالب هندسة اتصالات ولدي مشروع تخرج واريد بناء تطبيق اندرويد
ارجو منكم شرح مفصل لهذا الكود الذي هو جزء من برنامج شبيه ببرنامجي وهو مفتوح المصدر
وخصوصاً ماذا تعني native  وكيف هذه الدوال بدون جسم رغم انها تقوم بوظائف!! وهي ليست abstract
وما معنى الكود الذي يكتب ضمن static  وماذا تعني ؟
انا اعلم ان static يمكن ان توضع قبل الدوال لتكون ستاتيك ميثود ويتم التعامل معها على مستوى الكلاس بدون انشاء اوبجكت ولكن هنا مذا حصل ؟
في هذا البرنامج يتم التعامل مع ملف ذو امتداد confg
وذلك بمساعدة الدوال الموجودة في هذا الكلاس ارجوكم ارجو المساعدة ولكم جزيل الشكر
 

import java.io.File;


public class Lirc {
    public static String POWER_TOGGLE = "Function18";
    
    static {
       System.loadLibrary("irdroid");
      }
    
    native int parse(String filename);
    native byte[] getIrBuffer(String irDevice, String irCode);
    native String[] getDeviceList();
    native String[] getCommandList(String irDevice);
    
    Lirc (){
    
        File dir = new File("/mnt/sdcard/log");
        dir.mkdirs();
    }

}

وهل يمكن استبدال هذه الطريقة بطريقة ابسط بحيث استطيع القراءة من ملف نصي موجود ضمن مجلدات المشروع ؟؟ بدلأ من استخدام الكلاس السابق

تم تعديل هذه المشاركة بواسطة أحمد أبو عبد البر في 25 فبراير 2014 في 19:04

#2

بالنسبة لـstatic فأنت تعلم أنه يمكن كتابة block هكذا في جافا:

public class Foo {
  public static void main(String[] args) {
    { // block start
      System.out.println("main");
    } // end
  }
}

ويمكنك أن تضع متغير static هكذا:

public class Foo {
  static String message = "main";

  public static void main(String[] args) {
    System.out.println(message);
  }
}

message سيهيأ مباشرة عند تحميل الـFoo، ادمج هاتين المعلومتين معاً تحصل على static block ينفذ مباشرة عند تحميل الـclass:

public class Foo {
  static {
    System.out.println("Foo");
  }

  public static void main(String[] args) {

  }
}

بمجرد تحميل الـFoo.class فالـblock سيفذ إجبارياً (لو أزلت static فالـblock سينفذ مع كل مرة تنشئ بها كائن من الفئة).

 

الغرض من هذا الـblock في حالتك هو تحميل المكتبة irdroid (في ويندوز irdroid.dll وفي لينكس وأندرويد irdroid.so) لذاكرة العملية باستخدام  System.loadLibrary.

 

هذه المكتبة مكتوبة بـc أو c++ ومعرفة فيها تلك الوظائف المبدوءة بـnative، أي أن البرنامج مكتوب جزئياً بـc\c++ لعمل شيء قد لايمكن عمله بجافا وهذه الفئة Lirc غرضها الربط مع تلك المكتبة.

 

يمكنك أن تبحث عن java native interface لتتعلم كيف تربط كود مكتوب بـc أو c++ مع جافا.

تم تعديل هذه المشاركة بواسطة Mr.B في 25 فبراير 2014 في 19:18

1
#3

كل الشكر لك على الاجابة والاهتمام

ولكن اخي لو أردت ان اطلع على هذه المكتبة التي يتم استدعءها كيف لي ذلك

لأفهم الية عمل هذه الوظائف لأنها كما قلت لك هي اساسية في الأكتفتي الرئيسي للبرنامج

انت تقصد ان الدالة المبدوءة ب native  هي اساسا دالة معرفة ومبنية في المكتبة التي تم تهيئتها بداية irdroid وفي لغة سي بلس او سي ؟

#4

نعم الدوال الـnative تجدها مكتوبة بـc أو c++، مثلاً:

native int parse(String filename);

ستكون شيء كهذا:

#include <jni.h>

#ifdef __cplusplus
extern "C" {
#endif

//
// native int parse(String filename);
//
JNIEXPORT void JNICALL
Java_Lirc_parse(JNIEnv *env,      // JNI functions
                jobject self,     // Lirc object pointer
                jstring filename) // String filename
{
  // ...
  // C/C++ implemention
  // ...
}

#ifdef __cplusplus
};
#endif

إذا كان لديك الملف المصدري، ابحث عن ملفات الـcpp أو c في المشروع.

#5

كل الشكر لك اخي الغالي

الرابط للبرنامج كامل https://github.com/Irdroid/Irdroid.git

 

قد تواجهني صعوبات اخرى في فهم  جزئيات اخرى من هذا الكود سأقوم بطرحها ان شاء الله هنا في هذا الموضوع وان اتسع بك المجال والوقت ان تتكرم علي بالاجابة

#6

ممكن التوضيح كيف يمكن استدعاء ملف نصي  من داخل مجلدات المشروع

يعني الملف هنا في المشروع السابق يتم تحميله من رابط انترنت وانا اريده ان يكون ضمن ملفات المشروع نفسه هل لي ذلك ؟

مواضيع مشابهة