Arvanttt

تند و سریع

Arvant

تند و سریع












فراخوانی توابع java در ++C

شنبه, ۱۷ مرداد ۱۳۹۴، ۰۹:۵۷ ب.ظ

احتمالا وقتی دارید یک بازی را با ابزاری با قابلیت چند سکویی مثل cocso2d-x توسعه می دهید پیش خواهد آمد که نیاز داشته باشید که از امکانات اختصاصی یک پلتفرم استفاده کنید .

به عنوان مثال فراخوانی متد مربوط به ثبت نظر و فراخوانی اکتیویتی بازار نمونه خوبی از این نیاز به حساب میاد یا خیلی مثال های دیگری که خود شما حتما هنگام تکمیل کردن بازی با آنها رو به رو خواهید شد.

خب هر وقت که به همچین نیازی برخوردید نیازی به درماندگی نیست اگر بلد باشید که در داخل کد های بازی که با ++C  نوشته اید توابع جاوا را فراخوانی کنید .

البته برای این کار باید آشنایی حداقلی با برنامه نویسی جاوا نیز داشته باشید که احتمالا این آشنایی رو دارید پس شروع می کنیم .

با یک مثال ساده شروع می کنیم .در ساده ترین حالت ما یک تابع جاوا بدون مقدار بازگشتی یا ارگومان ورودی داریم .سعی کنید بیشتر کار ها رو به همچین تابع هایی تبدیل کنید :)

چنانچه ما تابعی به اسم doMeAFavour  در داخل کلاس MyAwesomeJavaClass داشته باشیم برای فراخوانی آن  کافی است که به شکل زیر عمل کنیم .

 

  JniMethodInfo t;
  
 if (JniHelper::getStaticMethodInfo(t,
    "MyAwesomeJavaClass",
    "doMeAFavour",
    "()V")) { 
 t.env->CallStaticVoidMethod(t.classID, t.methodID);
 t.env->DeleteLocalRef(t.classID);
}

برای استفاده از متد های بالا نیاز به بارگذاری JniHelper.h دارید

به همین سادگی ...

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

احتمالا رشته "V()" رو داخل مثال بالا مشاهده کرید و در موردش کنجکاو شدید باید بگم که با این رشته شما نحوه فراخوانی تابع را به سی پلاس پلاس مشخص می کنید و در اصطلاح امضای تابع جاوا به شمار می رود که نشان دهنده نداشتن آرگومان ورودی و void بودن نوع بازگشتی است . 

برای شروع یک سری قانون به شرح زیر داریم  که باید بهش توجه داشته باشید:

Java Type Signature
void V
boolean Z
byte B
char C
short S
int I
long J
float F
double D
fully-qualified-class L fully-qualified-class ;
type[] [ type
method type ( arg-types ) ret-type

مثال :

static String doMeAFavour(int times)
// Signature: "(I;)Ljava/lang/String;"

static bool sayHello(String to, int times)
// Signature: "(Ljava/lang/String;I;)Z;"

ارسال پارامتر و بازگردانی مقدار:

فرض کنید تابعی با مقدار بازگشتی bool و دو آرگومان ورودی داریم 

static bool sayHello(String to, int times)

برای فراخوانی آن در سی پلاس پلاسبه صورت زیر عمل می کنیم 

 JniMethodInfo t;
 if (JniHelper::getStaticMethodInfo(t,
    "MyAwesomeJavaClass",
    "sayHello",
    "(Ljava/lang/String;I;)Z;")) {
    const char* myName = "Beautiful Name";
    int times = 3;
    jstring stringArg1 = t.env->NewStringUTF(myName);
    jboolean retV = t.env->CallStaticBooleanMethod(t.classID,
t.methodID,
stringArg1,
times);
t.env->DeleteLocalRef(t.classID);
t.env->DeleteLocalRef(stringArg1);
}

برای تبدیل نوع ها هم می توانید از توابع کلاس JniHelper استفاده کنید به عنوان مثال برای تبدیل نوع Jstring به string به شیوه زیر عمل می شود .

jstring s = (jstring) t.env->CallObjectMethod(t.classID,
t.methodID); 
// convert it to std::string
std::string str = JniHelper::jstring2string(s);

به احتمال زیاد کاربرد های خیلی بیشتری برای این تکنیک می تونید در نظر بگیرید :)

منبع

  • موافقین ۳ مخالفین ۰
  • شنبه, ۱۷ مرداد ۱۳۹۴، ۰۹:۵۷ ب.ظ
به اشتراک می گذارم : به اشتراک بگذاریم به اشتراک بگذاریم به اشتراک بگذاریم به اشتراک بگذاریم

نظرات  (۵)

  • محمد رضا باغبانی
  • خیلی مفید بود . مچکر
    دستتون درد نکنه لطفا بقیه آموزش ها رو هم قرار بدید
    با سلام
    میگم شما که تا حالا بازی چندان پیچیده ای که نیاز به پردازش بالا داشته باشه نساختین 
    و به نظرم تقریبا میشه بازیهاتون رو با هر انجین و زبانی ساخت 
    حالا میگم این چه اصراریه که رو سی پلاس پلاس دارین؟
    واسه کامپایل و اجرا و کر نویسی این پروژه ها وقتتون هدر نمیره ؟
    پاسخ:
    خب معمولا وقتی با کد نویسی راحت باشی کارایی رو که با انجین های معمولی زمان بره میشه راحت تر انجام داد و زمانی که شما برای کامپایل و کد نویسی کنار میزارید در مقابل وقتی که با کدنویسی صرف جویی میکنید خیلی بچشم نمیاد.
    در کل به نظرم هرکی با هرچی راحت تره دلیل نمیشه دیگران هم با همون راحت تر باشن.
    دلیل دیگرشم بزار خود ازاری معمولا تو سیستم عامل هم همین ایراد رو میگیرن آقا ویندوز مفت ویژوال استدیو مفت دات نت مفت سی شارپ مفت.چرا به خودت زحمت میدی و لینوکس و سی پلاس پلاس و کیوت کار میکنی :)

    اوکی متوجه شدم.

    درسته ، من هم با راحت بودن با  انجین و زبان و ... موافقم .

    بند  آخر هم میشه گفت پایبندی به اخلاق .
    منبع نوشته ات :
    http://stnguyen.com/cocos2d-x/call-java-functions-from-cpp.html

    اول سلام میگم

    با توجه به اون جواب کامنتی که بالا دادی
    من حرفتو قبول دارم که میگی هر کسی با هرچیزی راحته اما همین آموزشی که الان دادی بدون کتابخانه jni هیچ کاری انجام نمی ده. اگه از چرخ های ساخته شده استفاده کنی بهتره یا خودت چرخ بسازی؟ ببین تو برنامه نویسی جدید، دیگه هیچ کس چرخ نمی سازه برای مثال الان بهترین فریم ورک جاوا اسکریپت، جی کوئری است آیا خود گوگل نمی تونست بهترشو بسازه؟ مسلما میتونست ولی هیچ کس وقتشو برای ساخت چرخ هدر نمی ده. الان من میدونم که تو در زمینه سی استادی، هیچ مشکلی هم نیست اما به جای اینکه 70 درصد کد بنویسی 30 از انجین ها و فریم ورک ها استفاده کنی بهتره 30 درصد کد بنویسی 70 درصد رو بسپاری دست فریم ورک ها. این طوری هم در زمان صرفه جویی میشه و هم امنیت کارت بالا میره
    من خودم سی شارپ کارم با استفاده از سی شارپ میتونم برنامه و بازی برای دسکتاپ(ویندوز - مک و لینوکس) - اندروید - آی او اس - ویندوز فون - کنسول های بازی و ... بسازم چون من کاری به چرخ ساخته شده ندارم فقط ازش استفاده می کنم. این فرا خوانی توابع جاوا رو هم سی شارپ می نویسم خود فریم ورک ترتیبشو میده. من الان نمی خوام از سی شارپ تعریف کنم و بگم که خیلی خوبه و ... . نه الان تو در زمینه سی خیلی پیشرفت کردی میخوام بهت بگم سعی کن از فریم ورک ها(چرخ ها) استفاده کنی به جای اینکه زمان با ارزشتو با کد های طولانی که خودت می نویسی هدر بدی

    امید وارم برداشت بد نکنی
    این رو به عنوان نصیحت یه دوست بهت گفتم(البته اگه قبول کنی)


    پاسخ:
    سلام منبع به پست اضافه شد ممنونم.
    در مورد سایر موارد هم باید عرض کنم که نمیدونم شما چی رو با چی مقایسه کردید.من انجین انتخابیم cocos بوده چون خیلی فعلا قصد ورود به سه بعدی رو ندارم،نمیخوام حق کسی رو ضایع کنم،میخوام که مشکلی در انتشار نداشته باشم ،همه چیز انجین دم دست باشه،از قدرتش مطمئن باشم.انجینم اپدیت بشه و چند مورد دیگه تو همه این موارد گزینه های روی میز شامل unity ،udk،moai,corona میشن که خیلی راحت میشه از بینشون دلیل کنار گذاشتنشون رو حدث زد.
    در ثانی من طبق نظر شما باید خودم میشستم از صفر انجین میساختم نه اینکه از انجین استفاده کنم در حالی که من فعلا از انجین که چرخ که هیچ یه ماشینه برا خودش دارم استفاده میکنم.
    البته یه خصلت که شما نداری و من دارم اینه که من می خوام از همه چی سر در بیارم حتی متریال  که شما تو چرخات داری و این نه خوبه نه بد یه خصیصه خلقیه که هرکسی میتونه داشته باشه و گاهی مفیده گاهی هم فقط اتلاف وقت ‌:)
    منم در صورتی که ابزاری باشه که کارم رو راحت تر کنه به راحتی ازش استفاده میکنم شاید دلیل براشت شما کارایی باشه که شما به سادگی انجام میدید و ما مجبوریم براش یادگیری داشته باشیم یا کدنویسی کنیم که اونم باز بر میگرده به انتخابی که معیار های شما با من متفاوت بوده.به همین راحتی :)