জাভার নেটিভ কীওয়ার্ডটি কী জন্য?


476

এই ধাঁধাটি খেলার সময় (এটি একটি জাভা কীওয়ার্ড ট্রিভিয়া গেম), আমি nativeকীওয়ার্ডটি পেলাম ।

জাভার নেটিভ কীওয়ার্ডটি কী জন্য ব্যবহৃত হয়?


উত্তর:


342

মূল nativeশব্দটি JNI (জাভা নেটিভ ইন্টারফেস) ব্যবহার করে স্থানীয় কোডে প্রয়োগ করা হয়েছে তা বোঝাতে কীওয়ার্ডটি কোনও পদ্ধতিতে প্রয়োগ করা হয়।


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

443

ন্যূনতম চলমান উদাহরণ

Main.java

public class Main {
    public native int square(int i);
    public static void main(String[] args) {
        System.loadLibrary("Main");
        System.out.println(new Main().square(2));
    }
}

Main.c

#include <jni.h>
#include "Main.h"

JNIEXPORT jint JNICALL Java_Main_square(
    JNIEnv *env, jobject obj, jint i) {
  return i * i;
}

সংকলন এবং চালান:

sudo apt-get install build-essential openjdk-7-jdk
export JAVA_HOME='/usr/lib/jvm/java-7-openjdk-amd64'
javac Main.java
javah -jni Main
gcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include \
  -I${JAVA_HOME}/include/linux Main.c
java -Djava.library.path=. Main

আউটপুট:

4

উবুন্টু 14.04 এএমডি 64 তে পরীক্ষিত। এছাড়াও ওরাকল জেডিকে 1.8.0_45 এর সাথে কাজ করেছে।

আপনার সাথে খেলতে গিটহাবের উদাহরণ

জাভা প্যাকেজ / ফাইলের নামগুলিতে বোঝা উচিত _1সি ফাংশন নাম দিয়ে উল্লিখিত হিসাবে: এন্ড্রয়েড প্যাকেজের নাম অ্যান্ড্রয়েড প্যাকেজ নাম জেএনআই ফাংশন শুরু

ব্যাখ্যা

native আপনি করতে পারবেন:

  • জাভা থেকে স্বেচ্ছাসেবী সমাবেশ কোড সহ একটি সঙ্কলিত গতিশীল লোড লাইব্রেরি (এখানে সি লেখা) কল করুন
  • এবং জাভায় ফিরে ফলাফল পান

এটি ব্যবহৃত হতে পারে:

  • উন্নত সিপিইউ সমাবেশের নির্দেশাবলীর সাথে একটি জটিল বিভাগে দ্রুত কোড লিখুন (সিপিইউ বহনযোগ্য নয়)
  • সরাসরি সিস্টেম কল করুন (ওএস পোর্টেবল নয়)

নিম্ন বহনযোগ্যতার ট্রেড অফ দিয়ে।

আপনার পক্ষে সি থেকে জাভা কল করাও সম্ভব, তবে আপনাকে অবশ্যই প্রথমে সি তে একটি জেভিএম তৈরি করতে হবে: সি ++ থেকে জাভা ফাংশনগুলি কীভাবে কল করবেন?

অ্যান্ড্রয়েড এনডিকে

ধারণাটি এই প্রসঙ্গে ঠিক একই, আপনাকে সেট আপ করতে অ্যান্ড্রয়েড বয়লারপ্লেট ব্যবহার করতে হবে except

অফিসিয়াল এনডিকে রিপোজিটরিতে "ক্যানোনিকাল" উদাহরণ রয়েছে যেমন হ্যালো-জনি অ্যাপ্লিকেশন:

আপনি unzipএকটি .apkNDK অ্যান্ড্রয়েড হে উপর সঙ্গে, আপনি প্রাক কম্পাইল দেখতে পারেন .soঅধীনে নেটিভ কোড সাথে সঙ্গতিপূর্ণ যে lib/arm64-v8a/libnative-lib.so

টোডো নিশ্চিত করুন: তদুপরি,, file /data/app/com.android.appname-*/oat/arm64/base.odexবলেছে এটি একটি ভাগ করা লাইব্রেরি, যা আমার মনে হয় এওটি প্রিম্পম্পাইলড। ডেক্সটি এআরটিতে জাভা ফাইলগুলির সাথে সম্পর্কিত, আরও দেখুন: অ্যান্ড্রয়েডে ওডেক্স ফাইলগুলি কী কী? তাই সম্ভবত জাভা আসলে একটি nativeইন্টারফেস মাধ্যমে চালানো হয় ?

ওপেনজেডকে 8-তে উদাহরণ

আসুন সন্ধান করি কোথায় Object#clonejdk8u60-b27 এ সংজ্ঞায়িত করা হয়েছে।

আমরা উপসংহারে পৌঁছে যাব যে এটি একটি nativeকল দিয়ে কার্যকর করা হয়েছে ।

প্রথমে আমরা খুঁজে পাই:

find . -name Object.java

যা আমাদেরকে জেডিকে / এসসিআর / শেয়ার / ক্লাস / জাভা / ল্যাং / অবজেক্ট.জভাতে পৌঁছে দেয় # l212 :

protected native Object clone() throws CloneNotSupportedException;

এখন শক্ত অংশটি এসেছে, যেখানে সন্ধান সমস্ত ক্লান্তির মাঝে ক্লোন রয়েছে। যে প্রশ্নটি আমাকে সহায়তা করেছিল তা হ'ল:

find . -iname object.c

যা সি বা সি ++ ফাইলগুলির সন্ধান করবে যা অবজেক্টের স্থানীয় পদ্ধতি প্রয়োগ করতে পারে। এটি আমাদেরকে জেডিকে / শেয়ার / নেটিভ / জাভা / ল্যাং / অবজেক্ট.সি এর দিকে নিয়ে যায় # l47 :

static JNINativeMethod methods[] = {
    ...
    {"clone",       "()Ljava/lang/Object;",   (void *)&JVM_Clone},
};

JNIEXPORT void JNICALL
Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
{
    (*env)->RegisterNatives(env, cls,
                            methods, sizeof(methods)/sizeof(methods[0]));
}

যা আমাদের JVM_Cloneপ্রতীক নিয়ে যায়:

grep -R JVM_Clone

যা আমাদের হটস্পট / এসসিআর / শেয়ার / ভিএম / প্রাইমস / জেভিএম.cpp # l580 এ নিয়ে যায় :

JVM_ENTRY(jobject, JVM_Clone(JNIEnv* env, jobject handle))
    JVMWrapper("JVM_Clone");

একগুচ্ছ ম্যাক্রো প্রসারিত করার পরে, আমরা এই সিদ্ধান্তে পৌঁছেছি যে এটি সংজ্ঞা পয়েন্ট।


1
দুর্দান্ত উত্তর। কেবল একটি পাদটীকা: একটি static nativeজাভা পদ্ধতির জন্য, সি ++ ফাংশনের দ্বিতীয় প্যারামিটারটি টাইপের jclassএবং না jobject
এসআর_আর

@ এসআর_ তথ্যটির জন্য ধন্যবাদ। আমার উত্তরে কোনও ভুল ছিল, নাকি এটি কিছু অতিরিক্ত তথ্য?
সিরো সান্তিলি 8 冠状 病 六四 事件 法轮功

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

419

এটি একটি পদ্ধতি চিহ্নিত করে, এটি জাভাতে নয়, অন্য ভাষায় প্রয়োগ করা হবে। এটি জেএনআই (জাভা নেটিভ ইন্টারফেস) এর সাথে একসাথে কাজ করে।

পারফরম্যান্স সমালোচনামূলক বিভাগগুলি লেখার জন্য অতীতে নেটিভ পদ্ধতি ব্যবহার করা হত তবে জাভা দ্রুত গতিতে আসার সাথে এখন এটি খুব কম দেখা যায়। স্থানীয় পদ্ধতি বর্তমানে প্রয়োজন হয় যখন

  • আপনার জাভা থেকে একটি লাইব্রেরি কল করতে হবে যা অন্য ভাষায় লেখা।

  • আপনার সিস্টেম বা হার্ডওয়্যার রিসোর্সগুলি অ্যাক্সেস করতে হবে যা কেবলমাত্র অন্য ভাষা থেকে পৌঁছতে পারে (সাধারণত সি)। প্রকৃতপক্ষে, অনেকগুলি সিস্টেম ফাংশন যা প্রকৃত কম্পিউটারের সাথে যোগাযোগ করে (উদাহরণস্বরূপ ডিস্ক এবং নেটওয়ার্ক আইও) কেবল এটি করতে পারে কারণ তারা নেটিভ কোডকে কল করে।

এছাড়াও দেখুন জাভা নেটিভ ইন্টারফেস স্পেসিফিকেশন


3
এটি আমার বোঝার জন্য আমি জাভা ফাইলটিতে সিস্টেম.কন্ট্রেনটাইমমিলিস () (যা স্থানীয়) এবং তারপরে এটি কাজ করার জন্য, জেএনআই লাইব্রেরি বা সি বা সি ++ বা সমাবেশ ভাষায় লিখিত কিছু ফাংশন কল করবে এবং তারপরে কিছুটা মান আমার জাভা কোডে ফিরিয়ে দেবে । উদাহরণস্বরূপ: এখানে বর্তমানকালীনমিলিস পদ্ধতিটি জেএনআইয়ের সহায়তায় একটি নেটিভ কোডটি আহ্বান করে এবং সেই নেটিভ কোডটি সিস্টেম রিসোর্সের সাথে কথা বলে প্রাক্তন: একটি টাইমার মাদারবোর্ডে বসে এইভাবে রিটার্নের মান (সিস্টেমের সময়) পাবে। আমাকে সংশোধন করুন, দয়া করে?
এমকোড

4
@ এমকোড পদ্ধতিগুলি জেডিকে-র currentTimeMillisঅংশ এবং এগুলি এন্টারনেট করা হয়েছে nativeকারণ বাস্তবায়নটি জেডিকে উত্স কোডেই রয়েছে । এটি প্রয়োগের পক্ষে সমাবেশ ভাষা ব্যবহার করা খুব সম্ভব নয়; এটি সম্ভবত অপারেটিং সিস্টেমের একটি API পদ্ধতি কল করে যা JVM উপরে চলছে। উদাহরণস্বরূপ উইন্ডোজ এ এটি GetSystemTimeকার্নেল 32.dll এ একটি ডিএলএল পদ্ধতি কল করতে পারে। অন্য একটি ওএসে এটির আলাদা বাস্তবায়ন হবে। তবে আপনি যখন nativeলিখছেন এমন কোনও পদ্ধতির জন্য ব্যবহার করেন (জেডিকে পদ্ধতির বিপরীতে) আপনাকে জেএনআই ব্যবহার করে বাস্তবায়ন সরবরাহ করতে হবে।
অ্যাডাম

নেটিভ কীওয়ার্ডের জন্য এই বিবৃতিটি গুরুত্বপূর্ণ ... 'আপনাকে সিস্টেম বা হার্ডওয়্যার রিসোর্সগুলি অ্যাক্সেস করতে হবে যা কেবলমাত্র অন্য ভাষা (সাধারণত সি) থেকে পৌঁছতে পারে'।
আতিকখালে

@ কিডবুরলা আমি জিজ্ঞাসা করতে পারি যে "জেডিকে উত্স কোডেই বাস্তবায়ন হচ্ছে" এর দ্বারা আপনি কী বোঝাতে চেয়েছেন? currentTimeMillisদেশীয় হিসাবে চিহ্নিত করা হয়েছে java.lang.Systemযাতে এটি জেএনআই ব্যবহার করে, তাই না?
ফ্লো 2 কে

1
@ ফ্লো 2 কে হ্যাঁ, আপনি যা বলেছেন তা সম্ভবত সত্য, আমি কেন জানি আমার মন্তব্যে (২ বছরেরও বেশি আগে) বলেছি তা নিশ্চিত নই
অ্যাডাম

59

থেকে সরাসরি জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন :

এমন একটি পদ্ধতি যা nativeপ্ল্যাটফর্ম-নির্ভর কোডে প্রয়োগ করা হয়, সাধারণত অন্য প্রোগ্রামিং ভাষায় যেমন C, C ++, FORTRAN বা সমাবেশ ভাষাতে লেখা হয়। কোনও nativeপদ্ধতির শৃঙ্খলাটি কেবল একটি সেমিকোলন হিসাবে দেওয়া হয় যা ইঙ্গিত করে যে বাস্তবায়নটি একটি ব্লকের পরিবর্তে বাদ পড়েছে।


19

যেমন স্ল্যাक्स উত্তর দিয়েছে, native শব্দটি স্থানীয় কোড কল করার জন্য।

এটি জাভাস্ক্রিপ্ট পদ্ধতি প্রয়োগের জন্য জিডব্লিউটি ব্যবহার করে ।


13

নেটিভ কোড প্রয়োগ করে এমন ফাংশনগুলি দেশীয় ঘোষিত হয়।

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

http://en.wikipedia.org/wiki/Java_Native_Interface


8

নেটিভ হ'ল নন অ্যাক্সেস মডিফায়ার it এটি কেবলমাত্র মেথডের জন্য প্রয়োগ করা যেতে পারে। এটি পদ্ধতি বা কোডের PLATFORM-DEPendENT বাস্তবায়ন নির্দেশ করে।


6

নেটিভ জাভাতে একটি কীওয়ার্ড, যা ব্যবহারহীন কাঠামো (পদ্ধতি) বিমূর্তের মতো তৈরি করতে ব্যবহৃত হয় তবে এটি প্ল্যাটফর্ম নির্ভর যেমন স্থানীয় কোড এবং জাভা স্ট্যাক নয় বরং নেটিভ স্ট্যাক থেকে চালানো হয়।


6
  • native জাভাতে একটি কীওয়ার্ড এটি প্ল্যাটফর্ম নির্ভর করে dependent
  • nativeপদ্ধতিগুলি জাভা ( জেএনআই ) এবং অন্যান্য প্রোগ্রামিং ভাষার মধ্যে ইন্টারফেস হিসাবে কাজ করে।

3

জাভা nativeপদ্ধতিটি কার্যকরী বা পারফরম্যান্সের কারণে জাভা কোডের জন্য ওএস স্থানীয় কোড কল করার জন্য একটি প্রক্রিয়া সরবরাহ করে।

উদাহরণ:

606  public native int availableProcessors();
617  public native long freeMemory();
630  public native long totalMemory();
641  public native long maxMemory();
664  public native void gc();

Runtime.classওপেনজেডিকেতে সম্পর্কিত ফাইলটিতে অবস্থিত JAVA_HOME/jmods/java.base.jmod/classes/java/lang/Runtime.class, এই পদ্ধতিগুলি রয়েছে এবং তাদের ACC_NATIVE( 0x0100) দিয়ে ট্যাগ করেছে এবং এই পদ্ধতিগুলিতে কোড বৈশিষ্ট্য থাকে না , যার অর্থ এই পদ্ধতিটিতে Runtime.classফাইলটিতে কোনও আসল কোডিং যুক্তি থাকে না :

  • পদ্ধতি 13 availableProcessors: স্থানীয় হিসাবে ট্যাগ এবং কোনও কোড অ্যাট্রিবিউট
  • পদ্ধতি 14 freeMemory: স্থানীয় হিসাবে ট্যাগ এবং কোনও কোড অ্যাট্রিবিউট
  • পদ্ধতি 15 totalMemory: স্থানীয় হিসাবে ট্যাগ এবং কোনও কোড অ্যাট্রিবিউট
  • পদ্ধতি 16 maxMemory: স্থানীয় হিসাবে ট্যাগ এবং কোনও কোড অ্যাট্রিবিউট
  • পদ্ধতি 17 gc: স্থানীয় হিসাবে ট্যাগ এবং কোনও কোড অ্যাট্রিবিউট

এখানে চিত্র বর্ণনা লিখুন

প্রকৃতপক্ষে কোডিং যুক্তিটি সংশ্লিষ্ট রানটাইম। সি ফাইলটিতে রয়েছে:

42  #include "java_lang_Runtime.h"
43
44  JNIEXPORT jlong JNICALL
45  Java_java_lang_Runtime_freeMemory(JNIEnv *env, jobject this)
46  {
47      return JVM_FreeMemory();
48  }
49
50  JNIEXPORT jlong JNICALL
51  Java_java_lang_Runtime_totalMemory(JNIEnv *env, jobject this)
52  {
53      return JVM_TotalMemory();
54  }
55
56  JNIEXPORT jlong JNICALL
57  Java_java_lang_Runtime_maxMemory(JNIEnv *env, jobject this)
58  {
59      return JVM_MaxMemory();
60  }
61
62  JNIEXPORT void JNICALL
63  Java_java_lang_Runtime_gc(JNIEnv *env, jobject this)
64  {
65      JVM_GC();
66  }
67  
68  JNIEXPORT jint JNICALL
69  Java_java_lang_Runtime_availableProcessors(JNIEnv *env, jobject this)
70  {
71      return JVM_ActiveProcessorCount();
72  }

এবং এই Cকোডিংটি libjava.so(লিনাক্স) বা libjava.dll(উইন্ডোজ) ফাইলে সংকলিত রয়েছে , এখানে অবস্থিত JAVA_HOME/jmods/java.base.jmod/lib/libjava.so:

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

উল্লেখ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.