How to Call Java functions from C Using JNI

موضوع كلش فيكة لانه مو فدشي عادي من تستخدم فنكشن من غير لغه بينما استخدام ادوات من صيغة مناسبه ومتوافقة يعتبر حل لا بئس بيه مثل الـVB.Net من تضيفون فايلات من نوع DLL بصفتها صيغة متوافقه ويشتغل البرنامج بشكل طبيعي


الفكره انك تستخدم فنكشن من Library مال غير لغة والي راح تقوم الفكرة على تنفيذ الكود وتسوي مثل activation للفايل الي يشغل الـجافا ويا البرامج المرافقه والي على سبيل المثال JDK والي هو يعتبر حل مثالي لكومة مشاكل بالجافا

هسه اني لو اشكد ما لغيت يمكن مراح تستوعبوني بشكل صحيح

الي نحتاجه هو # Sun Java Developer Kit (JDK).ويفضل ان يكون Java 1.6.0.

واي Compiler يدعم الـ++C

ف راح ابلش اشرح بالكودات وانشالله الي اكدر اوصللكم الفكره بشكل صحيح

نجي نسوي فايل اسمه CTest.cpp ونجي نسوي اربع j@va classes وخل نفترض انها هيجي

كود:
HelloWorld.java
كود:
ControlDetail.java
WorkOrder.java
ReturnData.java


نفترض انه

HelloWorld: راح يحوي الفنكشن بالجافا والي راح يتم تشغيله بالMain Class والي هو CTest.cpp بلغة ال ++C وبقية الفنكشنز تتحكم بالعمليات الي راح تصير عالداتا من تدخل عالـHelloWorld والي راح تكون عبارة عن reference او مرجع مثل مثل منكول من يكون عدكم main class وsub classes تندرج جواه

نجي نسوي الفنكشن مالـ الـHelloWorld

كود:
public static void main(String args[])
{
}
public static void TestCall(String szArg)
{
}

public static int DisplayStruct(ControlDetail ctrlDetail)
{
}

public static void DisplayStructArray(WorkOrder ArrWO[])
{
}

public static Object ReturnObjFunc()
{
}


والي راح يتم استدعاءه من يتم تنفيذ كود السيC

زين احنا حتى نستدعيها من الجافا فــ اكيد لازم نشغل الliibrary مال الجافا ويا البرامج الي تدعمها

والي هي لو JRE وJDK او بكل بساطة الـJVM الي تمثل الاثنين بنفس البرنامج او التطبيق

فــ بالــJVM نكتب هالكود

كود:
JNIEnv* create_vm(JavaVM ** jvm) {

JNIEnv *env;
JavaVMInitArgs vm_args;

JavaVMOption options;
//Path to the java source code
options.optionString = "-Djava.class.path=D:\\Java Src\\TestStruct";
vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
vm_args.nOptions = 1;
vm_args.options = &options;
vm_args.ignoreUnrecognized = 0;

int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);
if(ret < 0)
printf("\nUnable to Launch JVM\n");
return env;
}


مع ملاحظة انه لازم نحول قيمة الــ options.optionString الى مكان الفايل الي راح يستخدم المشغل والي هو الــJDK يعني نغير الD الى C بأعتبار ان البرنامج منصب بالبارتشن C وهم يحتاج نغير اسم النسخة مال الJDK الى اسمها مثلا JDK5.0

زين هسه نجي نشرحلكم شلون تربطون اي فنكشن من السي

يحتاج تسوون 3 خطوات

اولا:تححدون اسم الـClass بواسطة الـFindClass(,,) method
ثانيا:تحدد الـMethod ID الي راح تستعمله ويا الفنكشنز الي راح تسح بياناتها من الـclass الي راح تستدعيه بالـGetStaticMethodID و GetMethodID function calls.
ثالثا:تستعدي الفنكشنز بالـــCallStaticVoidMethod, CallStaticIntMethod و CallStaticObjectMethod.

ملاحظة مهمه:لازم نعرف الــfunction signatures خلال تعريف الـMethod ID والي يفضل ان تستخدم ويه هالكوماند

كود:
javap -s -p HelloWorld


على فرض انه الـHelloWorld هو الــmain class بالجافا الي مسوين منه inheritance للــclasses التابعه اله

يعني هيجي المفروض يصير الكود

كود:
D:\Java Src\TestStruct>javap -s -p HelloWorld
كود:
Compiled from "HelloWorld.java"
public class HelloWorld extends java.lang.Object{
public HelloWorld();
Signature: ()V
public static void main(java.lang.String[]);
Signature: ([Ljava/lang/Stringشلون تستدعي فنكشن من الجافا بأستعمال السي بلس بلس WinkV
public static void TestCall(java.lang.String);
Signature: (Ljava/lang/Stringشلون تستدعي فنكشن من الجافا بأستعمال السي بلس بلس WinkV
public static int DisplayStruct(ControlNEDetail);
Signature: (LControlNEDetailشلون تستدعي فنكشن من الجافا بأستعمال السي بلس بلس WinkI
public static void DisplayStructArray(WorkOrder[]);
Signature: ([LWorkOrderشلون تستدعي فنكشن من الجافا بأستعمال السي بلس بلس WinkV
public static java.lang.Object ReturnObjFunc();
Signature: ()Ljava/lang/Object;
}


ملاحظة:

خلال تعريف الـMethod الي بالGetMethodID function
اذا جان الـMethod هو عبارة عن constructor فـ الـMethod لازم تاخذ التسميه
كود:



زين شلون نشغله؟ او شلون تصير عملية الـCompilation

نسوي عملية Compilation للـ *.java files

بأستخدام javac command.

Compile CTest.cpp file using any C++ compiler I used MSVC++6.

وبالنهاية احب اكوللكم انه هذا المصدر اذا حبيتوا تتطلعون زيادة عالمعلومات الي شرحتها وترجمتها للهجه العاميه مالتنا (منتطور للانكليزي لو زمال يركب 1000 زمال)

http://www.codeproject.com/KB/cpp/CJniJava.aspxشلون تستدعي فنكشن من الجافا بأستعمال السي بلس بلس Tongueresent:شلون تستدعي فنكشن من الجافا بأستعمال السي بلس بلس Tongueresent:شلون تستدعي فنكشن من الجافا بأستعمال السي بلس بلس Tongueresent:

تقبلوا تحياتي وانشالله اكون كفيت و وفيت وأديت الي عليه:thumbup1::thumbup1::thumbup1::thumbup1::thumb up1: