استفاده از Java Native Interface در زبان سی شارپ

JNI) Java Native Interface) مجموعه امکانات موجود در جاوا است. برنامه هایی ک از JNI استفاده میکنند , میتواند کد جاوا را با کد زبان های دیگر مانند دلفی ، سی شارپ و سی پلاس پلاس ترکیب کنند. در این مثال نشان خواهیم داد که چگونه یک جفت method جاوا را از سی شارپ فراخوانی کنیم.
Java Native Interface

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

پیش زمینه

یکی از مهمترین چیز ها برای اشنایی با Field Descriptors , JNI است همانطور ک شما بهTest harness توجه خواهید کرد ، هنگامی که من صدا میزنیم method جاوایی را که پارامتر string میگیرد من از مسیر “Ljava/lang/String;”عبور میکنم.

اینtypeField را در زبان برنامه نویسی جاوا نشان میدهد برای مثال شما اگر بخواهید نمایش دهید متغیر های Int باید از حرف (I)استفاده کنید و برای float از حرف (F), عبارات boolean از(Z) و … استفاده کنید.

جدول زیر انواع متغیر در زبان جاوا و متناظر آن ها در JNI را نشان میدهد.

JNI Field Descriptor Java Language Type
Z boolean
B byte
C char
S short
I int
J long
F float
D double
Ljava/lang/String; string
[Ljava/lang/Object; object[]

Method descriptor از Fields Descriptor استفاده میکند و ساختار method های جاوا را توصیف میکند.

هیچ فضایی بین Field descriptorها در method descriptor وجود ندارد.

بخشی از void نوعی را برمیگرداند که با (V) مشخص شده است و بقیه type ها که برگردانده میشود برای field descriptor استفاده میشود.

جدول زیر methodهای جاوا با علائم متناظر آن در JNI Descriptor توصیف میکند.

JNI method descriptor هنگامیکه method جاوایی از زبان سی شارپ توسط JNI فراخوانی شده باشد استفاده میشود.

Java Method Declaration JNI Method Descriptor
String foo(); “()Ljava/lang/String;”
Void bar(int I, bool b); (IZ)V

استفاده از کد

یک مرجع اسمبلی اماده شده برای JNI در بخش دانلود این کد قرار داده شده است. شما میتوانید شروع کنید به فراخوانی method های جاوا تنها در چند خط کد !!!

اولین چیزی که برای انجام احتیاج دارین ساختن شی(object) از dictionary که شامل همه پارامتر ها برای داده شدن به Java virtual machine خواهد بود در مثال زیر حداقل تنظیمات مسیر کلاس را برای فراخوانی JVM که کلاس ها و پکیج ها راجست جو خواهد کرد انجام میدهیم.

private Dictionary<string, string>jvmParameters = new Dictionary<string, string>();

jvmParameters.Add("-Djava.class.path", Location of the java class);

یکی از پارامترهای JVM اختصاص داده شده به dictionary object که نمونه ساخته شده از JavaNativeInterface است. اولین بار که متد loadJVM ساخته شد احتیاج دارد که به همراه پارامترهای JVM فراخوانی بشود و پس از آن Java virtual Machine بارگذاری خواهد شد.

اولین فراخوانی , کاربر نمونه ای از Java object را فراخوانی میکند (توجه کنید که استفاده از InstantiateJavaObject اختیاری است کاربری ممکن است بخواهد Static method فراخوانی کند که در این صورت این احتیاجی به فراخوانی ندارد).

Java = newJavaNativeInterface();

Java.LoadVM(jvmParameters, false);

Java.InstantiateJavaObject(Name of the java class excluding the extension);

هنگامی که JVM و یک کلاس نمونه بارگذاری شد کاربر میتواند هر method که میخواهد فراخوانی کند.

ابتدا object از لیست که شامل همه پارامتر ها داده شده بهmethodJava درست میشود بعد آن object ساخته شده از لیست میتواند نگه دارد انواع مختلف پارامترها که از object هر چیزی به ارث میبرد.

List<object> olParameters = new List<object>();

olParameters.Add(Value of the parameter to be passed to the java method);

در مرحله بعد , به زبان ساده متد اصلی فراخوانی میشود Callmethod نوع متد جاوا را به عنوان یک نوع الگو برمیگرداند در مثال زیر من متد Callmethod<string> را فرا میخوانم که به این معنا است نوع برگردانده شده متد جاوایی که فراخوانی میکنیم از نوع String است.

بعد نام متد جاوا برای فراخوانی متد descriptor داده میشود سرانجام لیست همه پارامتر ها داده میشود (توجه کنید که اگر پارامتری نیاز نباشد در نتیجه لیست خالی خواهد بود)

Java.CallMethod<string>("AddTwoNumbers", "(IILjava/lang/String;)I", olParameters);
استفاده از Java Native Interface در زبان سی شارپ
۵ (۱۰۰%) ۱ رای

(434 نوشته)

C# Programmer , Web Design And Developer , MVC , ASP.NET

یک فکر در “استفاده از Java Native Interface در زبان سی شارپ

فکر شما چیست؟

آدرس ایمیل شما منتشر نخواهد شد. بخشهای موردنیاز علامتگذاری شدهاند *

حاصل جمع اعداد را وارد کنید : *