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

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

استفاده از کتابخانه های خارجی C
برای استفاده از کتابخانه در برنامه خود، باید آن را از یک متد یا کلاس ابزار فراخوانی کنید. از متد External external (String libraryTag) موجود در کلاس ApplicationMethod یا کلاس ApplicationLanguageBase برای برگرداندن یک شی از نوع External با متدهای زیر استفاده کنید.
جدول 4-1: روش ها برای شی خارجی
روش
شرح
طولانی فراخوانی (روش رشته، آرگومان های شی…)
متد بومی نامگذاری شده را در کتابخانه با آرگومان های ارائه شده فراخوانی می کند. رشته ها به char * تبدیل می شوند . مقدار برگردانده شده توسط متد را برمی گرداند.
long invokeWideString (روش رشته، آرگومان های Object…)
متد بومی نامگذاری شده را در کتابخانه با آرگومان های ارائه شده فراخوانی می کند. رشته ها به wchar_t * تبدیل می شوند . مقدار برگردانده شده توسط متد را برمی گرداند.
void close()
کتابخانه را آزاد می کند و منابع را آزاد می کند. اگر این روش را فراخوانی نکنید، زمانی که دیگر به کتابخانه خارجی نیاز نباشد، به طور خودکار فراخوانی می شود.
نحو می تواند باشد:
length = external(“native1”).invoke(“stringLength”, “MyObject”);
که تابع C را به صورت int stringLength(char *str) اعلان می کند. همچنین می توانید از کد زیر استفاده کنید:
کتابخانه خارجی = خارجی (“بومی”);
هفت = library.invoke(“sum”, 3, 4);
two = library.invoke(“sum”, 3, -1);
library.close();
که یک تابع C را به عنوان int sum (int a, int b) فرض می کند. اگر بخواهید چندین تماس با یک کتابخانه داشته باشید، دستور دوم کارآمدتر است.
انواع استدلال پشتیبانی شده
متدها می توانند حداکثر شش آرگومان داشته باشند و ممکن است (به صورت اختیاری) یک مقدار صحیح (یا اشاره گر بومی) را برگردانند که یک مقدار 64 بیتی در پلتفرم های 64 بیتی است. در جاوا، مقدار بازگشتی همیشه طولانی است.
همه انواع آرگومان ها پشتیبانی نمی شوند و برخی محدودیت ها اعمال می شود. به طور خاص، آرگومان های شناور به آرگومان های دوگانه تبدیل می شوند. تابع اصلی نباید با آرگومان های شناور اعلان شود. اگر نیاز به انتقال داده از نوع شناور دارید، می توانید به جای آن از یک آرایه شناور استفاده کنید که پشتیبانی می شود.
جدول 4-2: انواع آرگومان های پشتیبانی شده
نوع جاوا
نوع C/C++
ملاحظات
بولی
بوول
بایت
کاراکتر
کاراکتر
wchar_t
وابسته به سیستم 32 بیت در لینوکس و macOS، 16 بیت در ویندوز.
کوتاه
کوتاه
بین المللی
بین المللی
طولانی
طولانی طولانی
رشته
const char * یا
const whcar_t *
نسخه ای که در سمت C دریافت می کنید به این بستگی دارد که از کدام نسخه رابط فراخوانی استفاده می کنید. رشته تهی است و نباید تغییر داده شود. اظهار نظر wchar_t را در بالا مقایسه کنید.
شناور
دو برابر
آرگومان به طور خودکار به دقت مضاعف گسترش می یابد.
دو برابر
دو برابر
بولی[]
بوول *
بایت[]
کاراکتر *
کوتاه[]
کوتاه *
بین المللی[]
درون *
بین‌المللی[][]
درون **
طولانی[]
طولانی طولانی *
بدون محدودیت در هیچ پلتفرمی.
رشته[]
char ** یا
wchar_t **
از آرگومان های String[] می توان برای انتقال رشته ها به جاوا استفاده کرد. اظهارات String را در بالا مقایسه کنید.
شناور[]
شناور *
دو برابر[]
دو برابر *
دو برابر[][]
دو برابر **
برای انواع آرایه، تابع خارجی می تواند مقادیر موجود در آرایه ارائه شده را تغییر دهد. مقادیر به روز شده به برنامه جاوا منتقل می شوند. توجه داشته باشید که امکان تغییر اندازه آرایه منتقل شده توسط گیرنده وجود ندارد. تماس گیرنده و تماس گیرنده مسئول انتقال اندازه، با استفاده از یک استدلال اضافی یا یک قرارداد هستند. اگر تماس گیرنده حافظه را خارج از بافر اختصاص داده شده بنویسد یا بخواند، رفتار برنامه تعریف نشده است اما ممکن است شامل یک خروج ناگهانی از برنامه باشد. توجه داشته باشید که برای انواع آرایه دوگانه، فقط مقادیر ممکن است اصلاح شوند، نه هر اشاره گر.
برای آرگومان‌های نوع String[] ، برنامه می‌تواند یک اشاره‌گر را در آرایه اشاره‌گرها تغییر دهد تا به رشته‌ای با پایان تهی جدید اشاره کند که به جاوا بازگردانده می‌شود. حداکثر طول مجاز یک رشته 65535 کاراکتر است. از یک آرایه بایت برای انتقال حجم بیشتری از داده ها استفاده کنید. با تنظیم عنصر مربوطه در آرایه رشته‌ای بر روی 0 ، می‌توان مقدار null را به جاوا برگرداند .
انواع پیچیده‌تر باید در سمت جاوا به یک آرایه بایت سریالی شوند، که می‌تواند توسط callee از حالت سریال خارج شود.
تابع خارجی می تواند یک عدد صحیح ( int ) یا یک اشاره گر را به یک شی داخلی ( void * ) برگرداند. در جاوا، این مقدار به عنوان یک مقدار طولانی بازگردانده می شود، که به اندازه کافی گسترده است تا یک آدرس حافظه 64 بیتی را نگه دارد. اگر به یک رشته یا دو به عنوان مقدار بازگشتی نیاز دارید، در عوض باید یک آرایه با طول یک و نوع مناسب را ارسال کنید، که می تواند توسط تابع خارجی پر شود.
 
به عنوان خالق برنامه، باید مطمئن شوید که نوع درست آرگومان ها به ترتیب درست ارائه شده اند. هیچ بررسی وجود ندارد و انجام یک اشتباه می تواند به راحتی برنامه را خراب کند یا باعث رفتار نامشخص شود. به ویژه، هنگام کار با آرگومان های اعداد صحیح و ممیز شناور، باید مراقب باشید. تابعی که به عنوان sum (int a, int b) اعلام شده باید توسط invoke (“sum”, 1, 2) فراخوانی شود ، در حالی که تابعی که به عنوان sum (double a, double b) باید توسط invoke (“sum” فراخوانی شود. 1.0، 2.0) .
اشکال زدایی
ممکن است هنگام کار با برنامه‌ها، از یک دیباگر کد بومی (مانند Microsoft® Visual Studio®) استفاده کنید ابتدا باید کتابخانه را با نمادهای اشکال زدایی بسازید. سپس، این کتابخانه را به برنامه وارد کنید و دیباگر را به فرآیند COMSOL Multiphysics متصل کنید. یک نقطه شکست در تابع اصلی که می خواهید اشکال زدایی کنید قرار دهید. برنامه را در COMSOL Multiphysics اجرا یا آزمایش کنید. هنگامی که نرم افزار کتابخانه خارجی را بارگیری می کند، دیباگر باید بتواند کد منبعی را که نقطه شکست خود را در آن قرار داده اید با کتابخانه بارگذاری شده مطابقت دهد و هنگام فراخوانی تابع شکسته شود. برای جزئیات بیشتر به مستندات سیستم اشکال زدایی بومی خود مراجعه کنید.
نکات و نکاتی برای استفاده از کتابخانه های خارجی
هنگام دسترسی به حافظه از طریق کد اصلی خود بسیار مراقب باشید. شما به راحتی می توانید حافظه کل برنامه را خراب کنید که باعث رفتار نامشخص یا خرابی می شود.
شما باید برای هر پلتفرمی که قصد پشتیبانی با برنامه را دارید کتابخانه های جداگانه ای تهیه کنید، اما لازم نیست یک برنامه خاص از تمام پلتفرم های پشتیبانی شده توسط COMSOL Server پشتیبانی کند. در حال حاضر، پلتفرم های پشتیبانی شده ویندوز 64 بیتی، لینوکس 64 بیتی و macOS 64 بیتی هستند که در همه موارد از معماری AMD64 استفاده می کنند.
اکثر کامپایلرها کتابخانه های مشترکی را ایجاد می کنند که به محیط زمان اجرا ارائه شده توسط سایر کتابخانه های مشترک که با کامپایلر توزیع می شوند، بستگی دارد. باید مطمئن شوید که محیط زمان اجرا مناسب بر روی کامپیوترهای مورد نظر نصب شده است.
اگر کتابخانه کد بومی که می‌خواهید استفاده کنید آنقدر پیچیده است که نمی‌تواند در یک کتابخانه مشترک (DLL، so یا dylib) قرار بگیرد، باید کتابخانه را به طور جداگانه در رایانه مورد نظر (با استفاده از یک نصب‌کننده سفارشی) مستقر کنید. سپس، برنامه حاوی یک کتابخانه بسته بندی کوچک است که کتابخانه پیچیده را فراخوانی می کند. از نظر فنی، ممکن است بتوان کل نصب کننده کتابخانه پیچیده را در یک کتابخانه بزرگ اما ساده با روشی که کتابخانه پیچیده را نصب می کند، گنجاند، مشروط بر اینکه نیازی به حقوق مدیر سیستم نباشد.
نمونه ای از یک تابع خارجی
مراحل زیر نمونه ای از نحوه ایجاد و وارد کردن یک کتابخانه و سپس فراخوانی آن در متدها را نشان می دهد.
1
کتابخانه را ایجاد کنید.
کد منبع زیر یک تابع خارجی بی اهمیت نوشته شده در C++ را تعریف می کند که می خواهید آن را فراخوانی کنید. دستور #ifdef برای سازگاری کد منبع بین پلتفرم در نظر گرفته شده است، اما نوشتن یک کتابخانه مشترک معمولاً شامل تنظیمات خاص کامپایلر است، بنابراین ممکن است لازم باشد مستندات کامپایلر خود را بررسی کنید. فایل هدر، test.h ، به شرح زیر است:
// test.h : تابع صادر شده را اعلام می کند
#ifdef _MSC_VER
  #define TESTDLL_API __declspec(dllexport)
#دیگر
  #define TESTDLL_API __ویژگی__((__visibility__(“پیش فرض”)))
#endif
خارجی “C” {
  TESTDLL_API int testSum(int a, int b);
}
تعریف تابع، test.cpp ، به نظر می رسد:
// test.cpp : تابع صادراتی را برای کتابخانه تعریف می کند
#include “test.h”
// این نمونه ای از یک تابع صادر شده است.
TESTDLL_API int testSum(int a, int b) {
  برگرداندن a + b;
}
با استفاده از کامپایلر gcc، چیزی شبیه به زیر را در پوسته فرمان تایپ کنید:
gcc -shared -o test.so -fPIC test.cpp
اگر از یک محیط ساخت گرافیکی ++C مانند Microsoft Visual Studio استفاده می کنید، احتمالاً ساده ترین کار است که کد بالا را در یک پروژه DLL وارد کنید.
2
وارد کردن کتابخانه
یک گره خارجی C Library با برچسب native1 اضافه کنید و کتابخانه ایجاد شده در مرحله 1 را برای پلتفرم مناسب وارد کنید.
3
روش های فراخوانی:
یک گره Method اضافه کنید و کد زیر را در بدنه Execute Method وارد کنید:
long sum = external(“native1”).invoke(“testSum”, 1, 2);
alert(“1 + 2 = ” + sum);
یک دکمه به فرم اضافه کنید و روش اضافه شده در بالا را به عنوان دستور اجرا انتخاب کنید. اگر برنامه را روی همان پلتفرمی می‌سازید که کتابخانه برای آن ساخته شده است، می‌توانید روی Test Application کلیک کنید تا روش را آزمایش کنید. در غیر این صورت، برنامه را ذخیره کرده و در یک جلسه COMSOL Multiphysics روی پلتفرم صحیح اجرا کنید. در هر صورت، هنگامی که دکمه را در پنجره برنامه فشار می دهید، باید گفتگویی را مشاهده کنید که یک حقیقت را بیان می کند.