নেটিভ কোডে কল করার জন্য জেএনএর পরিবর্তে জেএনআই ব্যবহার করবেন?


115

জেএনএর তুলনায় নেটিভ কোডটি কল করা মোটামুটি সহজ বলে মনে হচ্ছে জেএনএ। কোন ক্ষেত্রে আপনি জেএনএর উপরে জেএনআই ব্যবহার করবেন?


আমরা জেএনআই-এর চেয়ে জেএনএকে বেছে নিয়েছি এমন একটি গুরুত্বপূর্ণ বিষয়টি হ'ল জেনা আমাদের স্থানীয় গ্রন্থাগারগুলিতে কোনও পরিবর্তন প্রয়োজন হয়নি। জাভা দিয়ে কাজ করতে পারার জন্য দেশীয় গ্রন্থাগারগুলি কাস্টমাইজ করা আমাদের জন্য বড় একটি সুযোগ ছিল না।
কেভিআর

উত্তর:


126
  1. জেএনএ সি ++ ক্লাসগুলির ম্যাপিং সমর্থন করে না, সুতরাং আপনি যদি সি ++ লাইব্রেরি ব্যবহার করেন তবে আপনার একটি জনি মোড়কের দরকার পড়বে
  2. আপনার যদি প্রচুর স্মৃতি কপি করা দরকার। উদাহরণস্বরূপ, আপনি একটি পদ্ধতি কল করেছেন যা আপনাকে একটি বৃহত বাইট বাফার ফিরিয়ে দেয়, আপনি এতে কিছু পরিবর্তন করেন, তারপরে আপনাকে অন্য একটি পদ্ধতি কল করতে হবে যা এই বাইট বাফার ব্যবহার করে। এর জন্য আপনাকে এই বাফারটি সি থেকে জাভাতে অনুলিপি করতে হবে, তারপরে এটি জাভা থেকে সিটিতে অনুলিপি করুন। এক্ষেত্রে জনি পারফরম্যান্সে জিতবে কারণ আপনি অনুলিপি ছাড়াই সিটিতে এই বাফারটি রাখতে এবং সংশোধন করতে পারেন।

এগুলিই আমি सामना করেছি। সম্ভবত আরও আছে। তবে সাধারণ পারফরম্যান্সে জেনা এবং জিন্নির মধ্যে এতটা আলাদা নয়, তাই আপনি যেখানেই জেএনএ ব্যবহার করতে পারেন, এটি ব্যবহার করুন।

সম্পাদনা

এই উত্তরটি বেশ জনপ্রিয় বলে মনে হচ্ছে। সুতরাং এখানে কিছু সংযোজন রয়েছে:

  1. আপনার যদি সি ++ বা সিওএম মানচিত্রের প্রয়োজন হয় তবে জেএনএরেটরের স্রষ্টা অলিভার চ্যাফিকের একটি লাইব্রেরি রয়েছে, তাকে ব্রিডজে বলা হয় । এটি এখনও একটি তরুণ গ্রন্থাগার, তবে এর অনেক আকর্ষণীয় বৈশিষ্ট্য রয়েছে:
    • ডায়নামিক সি / সি ++ / সিওএম ইন্টারপ: সি ++ পদ্ধতি কল করুন, সি ++ অবজেক্ট তৈরি করুন (এবং জাভা থেকে সাবক্লাস সি ++ ক্লাস করুন!)
    • জেনেরিক্সের ভাল ব্যবহার সহ স্ট্রেডওয়ার্ড টাইপ ম্যাপিংস (পয়েন্টারগুলির জন্য খুব ভাল মডেল সহ)
    • সম্পূর্ণ জেএনএরেটর সমর্থন
    • উইন্ডোজ, লিনাক্স, ম্যাকস এক্স, সোলারিস, অ্যান্ড্রয়েডে কাজ করে
  2. মেমোরি অনুলিপি হিসাবে, আমি বিশ্বাস করি জেএনএ সরাসরি বাইটবফার সমর্থন করে, তাই মেমরি অনুলিপি এড়ানো যায়।

সুতরাং, আমি এখনও বিশ্বাস করি যে যেখানেই সম্ভব, জেএনএ বা ব্রিডজে ব্যবহার করা আরও ভাল, এবং যদি পারফরম্যান্স সমালোচিত হয় তবে জনিতে ফিরে আসুন, কারণ আপনাকে যদি ঘন ঘন নেটিভ ফাংশনগুলি কল করতে হয় তবে পারফরম্যান্স হিট লক্ষণীয়।


6
আমি একমত নই, জেএনএর অনেক ওভারহেড রয়েছে। যদিও এর সুবিধাটি অ
সময়সম্মত

3
আমি একটি Android প্রকল্পের জন্য BridJ ব্যবহার করে, তার থেকে সরাসরি উদ্ধৃত করা আগে সাবধানতা পরামর্শ দিতে চাই ডাউনলোড পাতা : "BridJ Android এর উপর আংশিকভাবে কাজ করে / হাত emulators (SDK এর সঙ্গে), এবং সম্ভবত প্রকৃত ডিভাইসের (অপরীক্ষিত)। "
kizzx2

1
@ স্টকবি: আপনার যদি এপিআই সহ একটি লাইব্রেরি থাকে যেখানে আপনাকে সি ++ অবজেক্টগুলি পাস করতে হয়, বা সি ++ অবজেক্টে পদ্ধতি কল করতে পারেন, জেএনএ এটি করতে পারে না। এটি কেবল ভ্যানিলা সি পদ্ধতিতে কল করতে পারে।
ডেনিস তুলসকি

2
আমি যতদূর বুঝতে পারি, জেএনআই কেবলমাত্র বিশ্বব্যাপী JNIEXPORTফাংশনগুলি কল করতে পারে। আমি বর্তমানে জাভাসিপিকে একটি বিকল্প হিসাবে অন্বেষণ করছি, যা জেএনআই ব্যবহার করে, তবে আমার মনে হয় ভ্যানিলা জেএনআই এটি সমর্থন করে না। ভ্যানিলা জেএনআই ব্যবহার করে যে আমি উপেক্ষা করছি সে ব্যবহার করে কি সি ++ সদস্য ফাংশনগুলি কল করার কোনও উপায় আছে?
স্টকবি

1
দয়া করে এখানে একবার দেখুন: stackoverflow.com/questions/20332472/catch-a-double-hotkey
ス レ ッ ク

29

এত সাধারণ প্রশ্নের উত্তর দেওয়া মুশকিল। আমি মনে করি সর্বাধিক সুস্পষ্ট পার্থক্য হ'ল জেএনআই এর সাথে টাইপ রূপান্তরটি জাভা / নেটিভ সীমান্তের নেটিভ দিকে প্রয়োগ করা হয়, আর জেএনএর সাথে জাভাতে টাইপ রূপান্তরটি প্রয়োগ করা হয়। আপনি যদি ইতিমধ্যে সি তে প্রোগ্রামিং নিয়ে বেশ স্বাচ্ছন্দ্য বোধ করেন এবং কিছু নেটিভ কোড নিজেই প্রয়োগ করতে চান তবে আমি ধরে নেব যে জেএনআই খুব জটিল মনে হবে না। আপনি যদি জাভা প্রোগ্রামার হন এবং কেবল কোনও তৃতীয় পক্ষের নেটিভ লাইব্রেরি চালু করতে চান তবে জেএনএ ব্যবহার সম্ভবত জেএনআইয়ের সাথে সম্ভবত এতটা স্পষ্ট সমস্যা থেকে বাঁচার সবচেয়ে সহজ উপায়।

যদিও আমি কখনও কোনও মতপার্থক্য চিহ্নিত করেছি না, আমি নকশার কারণেই মনে করব, কমপক্ষে কিছু পরিস্থিতিতে জেনার সাথে এই জাতীয় রূপান্তরটি জেএনআইয়ের চেয়ে খারাপ সম্পাদন করবে। উদাহরণস্বরূপ অ্যারেগুলি পাস করার সময়, জেএনএ এগুলি প্রতিটি ফাংশন কলের শুরুতে জাভা থেকে নেটিভ এবং ফাংশন কলের শেষে ফিরে আসবে। জেএনআই-এর সাহায্যে আপনি নিজেকে নিয়ন্ত্রণ করতে পারবেন যখন অ্যারের একটি স্থানীয় "ভিউ" তৈরি হবে, সম্ভাব্যভাবে কেবল অ্যারের অংশের একটি দৃশ্য তৈরি করা হবে, বেশ কয়েকটি ফাংশন কল জুড়ে ভিউটি রাখুন এবং শেষে ভিউ প্রকাশ করুন এবং আপনি চান কিনা তা সিদ্ধান্ত নিতে পারেন পরিবর্তনগুলি রাখতে (সম্ভাব্যভাবে ডেটাটি অনুলিপি করার প্রয়োজন হয়) বা পরিবর্তনগুলি বাতিল করতে (কোনও অনুলিপি লাগবে না)। আমি জানি আপনি মেমরি ক্লাস ব্যবহার করে জেএনএর সাথে ফাংশন কল জুড়ে একটি নেটিভ অ্যারে ব্যবহার করতে পারেন, তবে এটির জন্য মেমরির অনুলিপিও প্রয়োজন হবে, যা জেএনআইয়ের সাথে অপ্রয়োজনীয় হতে পারে। পার্থক্যটি প্রাসঙ্গিক নাও হতে পারে, তবে যদি আপনার মূল লক্ষ্যটি স্থানীয় কোডে এর কিছু অংশ প্রয়োগ করে অ্যাপ্লিকেশন কর্মক্ষমতা বাড়াতে হয়, খারাপ সম্পাদনকারী সেতু প্রযুক্তি ব্যবহার করা সর্বাধিক সুস্পষ্ট পছন্দ বলে মনে হয় না।


8
  1. জেএনএ থাকার আগে আপনি কয়েক বছর আগে কোড লিখছেন বা একটি প্রাক 1.4 জেআরই টার্গেট করছেন।
  2. আপনি যে কোডটির সাথে কাজ করছেন তা কোনও ডিএলএল-এসও নয়।
  3. আপনি এমন কোডে কাজ করছেন যা এলজিপিএলের সাথে বেমানান।

আমার মাথার উপরের অংশটিই কেবল এটাই আসতে পারে, যদিও আমি উভয়ের ভারী ব্যবহারকারী নই। এটি দেখে মনে হচ্ছে আপনি যদি জেএনএ এড়াতে পারেন তবে আপনি যদি তাদের সরবরাহ করেন তার চেয়ে আরও ভাল ইন্টারফেস চান তবে আপনি জাভাতে এটি কোড করতে পারেন।


9
আমি প্রায় 2 এর সাথে একমত নই - স্ট্যাটিক লাইবকে ডায়নামিক লাইব রূপান্তর করা সহজ। আমার প্রশ্নটি দেখুন এটি স্ট্যাকওভারফ্লো
জেবি।

3
জেএনএ ৪.০ দিয়ে শুরু করে, জেএনএ এলজিপিএল ২.১ এবং অ্যাপাচি লাইসেন্স ২.০ উভয়ের অধীনে দ্বৈত-লাইসেন্স
পেয়েছে

8

যাইহোক, আমাদের একটি প্রকল্পে আমরা একটি খুব ছোট জেএনআই পাদদেশ প্রিন্ট রেখেছি। আমরা আমাদের ডোমেন অবজেক্টগুলির প্রতিনিধিত্ব করার জন্য প্রোটোকল বাফার ব্যবহার করেছি এবং এইভাবে জাভা এবং সি সেতুর জন্য কেবল একটি নেটিভ ফাংশন ছিল (তখন অবশ্যই সি ফাংশনটি অন্যান্য ফাংশনগুলির একটি গোছা কল করবে)।


5
সুতরাং, একটি মেথড কলের পরিবর্তে আমাদের মেসেজ পাস হচ্ছে। আমি জেএনআই এবং জেএনএ এবং ব্রিজেজে বেশ কিছুটা সময় ব্যয় করেছি, তবে খুব শীঘ্রই, তারা সবাই কিছুটা ভীতিকর হয়ে উঠছে।
উস্তামান সংগীত

5

এটি সরাসরি উত্তর নয় এবং জেএনএর সাথে আমার কোনও অভিজ্ঞতা নেই তবে যখন আমি জেএনএ ব্যবহার করে প্রকল্পগুলি দেখি দেখি এবং এসভিএনকিট, ইন্টেলিজ আইডিইএ, নেটবিয়ান আইডিআই ইত্যাদি নামগুলি দেখি বিশ্বাস করি যে এটি একটি খুব সুন্দর লাইব্রেরি।

আসলে, আমি স্পষ্টতই মনে করি আমি জেএনআইয়ের পরিবর্তে জেএনএ ব্যবহার করতাম যখন জেএনআইয়ের তুলনায় এটি সত্যই সহজ দেখাচ্ছে (যার একটি বিরক্তিকর উন্নয়ন প্রক্রিয়া রয়েছে)। খুব খারাপ, জেএনএ এই সময়ে মুক্তি পায় নি।


3

আপনি যদি জেএনআই পারফরম্যান্স চান তবে এর জটিলতায় ডান্ট হন, আপনি স্বয়ংক্রিয়ভাবে জেএনআই বাইন্ডিংগুলি তৈরি করে এমন সরঞ্জামগুলি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, জ্যানেট (অস্বীকৃতি: আমি এটি লিখেছি) আপনাকে একটি একক উত্স ফাইলে জাভা এবং সি ++ কোড মিশ্রিত করতে দেয় এবং উদাহরণস্বরূপ সি ++ থেকে জাভাতে স্ট্যান্ডার্ড জাভা সিনট্যাক্স ব্যবহার করে কল করতে পারে। উদাহরণস্বরূপ, আপনি কীভাবে জাভা স্ট্যান্ডার্ড আউটপুটে সি স্ট্রিং প্রিন্ট করবেন তা এখানে:

native "C++" void printHello() {
    const char* helloWorld = "Hello, World!";
    `System.out.println(#$(helloWorld));`
}

জ্যানেট তারপরে ব্যাকটিক-এম্বেড করা জাভাটিকে উপযুক্ত জেএনআই কলগুলিতে অনুবাদ করে।


3

আমি আসলে জেএনআই এবং জেএনএর সাথে কিছু সাধারণ বেনমার্ক করেছি।

অন্যরা ইতিমধ্যে উল্লেখ করেছে যে, জেএনএ সুবিধার জন্য। জেএনএ ব্যবহার করার সময় আপনার নেটিলি কোডটি সংকলন বা লেখার দরকার নেই। জেএনএর নেটিভ লাইব্রেরি লোডারও আমি দেখেছি এখন পর্যন্ত ব্যবহারের মধ্যে অন্যতম সেরা / সহজ iest দুঃখের বিষয়, আপনি এটি জেএনআই-এর জন্য ব্যবহার করতে পারবেন না বলে মনে হয়। (এই কারণেই আমি System.loadLibrary () এর জন্য একটি বিকল্প লিখেছি ) যা জেএনএর পাথ কনভেনশন ব্যবহার করে (অর্থাত্ জারস) থেকে লোডিং সমর্থন করে))

জেএনএর পারফরম্যান্স তবে জেএনআই-র চেয়ে অনেক খারাপ হতে পারে। আমি একটি খুব সাধারণ পরীক্ষা করেছি যেটিকে একটি সরল দেশীয় পূর্ণসংখ্যার ইনক্রিমেন্ট ফাংশন বলে "রিটার্ন আরগ +1;"। জেএমএইচ দিয়ে করা বেঞ্চমার্কগুলি দেখিয়েছে যে জেএনআই function ফাংশনটিতে কল করেছে, জেএনএর চেয়ে 15 গুণ দ্রুত।

আরও একটি "জটিল" উদাহরণ যেখানে নেটিভ ফাংশনটি 4 টি মানের পূর্ণসংখ্যার অ্যারের সমষ্টি করে তা এখনও দেখায় যে জেএনআই পারফরম্যান্স জেএনএর চেয়ে 3 গুণ বেশি গতিযুক্ত। হ্রাসযুক্ত সুবিধা সম্ভবত এটি ছিল যে আপনি কীভাবে জেএনআইতে অ্যারে অ্যাক্সেস করেছেন: আমার উদাহরণটি কিছু স্টাফ তৈরি করেছে এবং প্রতিটি সংক্ষেপণ ক্রিয়াকলাপের সময় এটি আবার মুক্তি দিয়েছে।

কোড এবং পরীক্ষার ফলাফলগুলি গিথুবে পাওয়া যাবে ।


2

পারফরম্যান্স তুলনার জন্য আমি জেএনআই এবং জেএনএ তদন্ত করেছি কারণ আমাদের প্রকল্পের মধ্যে একটি ডেল কল করার জন্য তাদের মধ্যে একটির সিদ্ধান্ত নেওয়ার প্রয়োজন ছিল এবং আমাদের আসল সময়সীমা ছিল। ফলাফলগুলি প্রমাণ করেছে যে জেএনআইয়ের তুলনায় জেএনএর চেয়ে বেশি পারফরম্যান্স রয়েছে (প্রায় 40 বার)। জেএনএতে আরও ভাল পারফরম্যান্সের কৌশল থাকতে পারে তবে এটি একটি সাধারণ উদাহরণের জন্য খুব ধীর।


1

আমি কিছু মিস করছি না, যদি না জেএনএ বনাম জেএনআইয়ের মধ্যে মূল পার্থক্য না যে জেএনএর সাথে আপনি জাভা কোডটি স্থানীয় (সি) কোড থেকে কল করতে পারবেন না?


6
আপনি পারেন। কলব্যাক ক্লাসের সাথে যা সি পাশের কোনও ফাংশন পয়েন্টারের সাথে মিলে যায়। অকার্যকর রেজিস্টার_ক্যালব্যাক (শূন্য (*) (কনস্ট ইন্ট)); পাবলিক স্ট্যাটিক নেটিভ শূন্য রেজিস্টার_ক্যালব্যাক (মাইক্যালব্যাক আরজি 1) এ ম্যাপ করা হবে; যেখানে মাই কল্যাব্যাক একটি ইন্টারফেস com.sun.jna প্রসারিত ইন্টারফেস যা একটি একক পদ্ধতিতে ক্যালব্যাক প্রয়োগযোগ্য (প্রয়োগ মান);
উস্তামান সংগীত

@ অগাস্টো এটিও একটি মন্তব্য হতে পারে দয়া করে
সুইফটবয়

0

আমার নির্দিষ্ট প্রয়োগে, জেএনআই ব্যবহার করা আরও সহজ প্রমাণিত হয়েছে। সিরিয়াল পোর্টে এবং এ থেকে আমার ধারাবাহিক স্ট্রিমগুলি পড়ার এবং লেখার দরকার ছিল - এবং অন্য কিছু নয়। জেএনএ-র মধ্যে খুব জড়িত অবকাঠামো শেখার চেষ্টা করার পরিবর্তে, আমি উইন্ডোজের একটি বিশেষ-উদ্দেশ্যে ডিএলএল দ্বারা মাত্র ছয়টি ক্রিয়াকলাপ রফতানি করে দেশীয় ইন্টারফেসের প্রোটোটাইপ করা আরও সহজ পেয়েছি:

  1. DllMain (উইন্ডোজ সাথে ইন্টারফেস প্রয়োজন)
  2. অনলয়েড (কেবল একটি আউটপুটডিবগ স্ট্রিং করে যাতে জাভা কোড সংযুক্ত হলে আমি জানতে পারি)
  3. অনলোড (ডিটো)
  4. খোলা (পোর্ট খোলে, থ্রেড পড়া এবং লেখা শুরু করে)
  5. QueueMessage (লেখার থ্রেড দ্বারা আউটপুট জন্য তথ্য সারি)
  6. গেটমেসেজ (শেষ কলের পর থেকে পঠিত থ্রেডের দ্বারা প্রাপ্ত ডেটার জন্য অপেক্ষা করে এবং ফেরত দেয়)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.