Javaにおけるネイティブメソッドとは何か、どこで使うべきか?[重複しています]。
2023-10-03 11:44:33
質問
ネイティブメソッドは抽象メソッドと同じ構文ですが、どこに実装されるのでしょうか?
どのように解決するのですか?
Javaにおけるネイティブメソッドとはどのようなもので、どこで使うべきものなのでしょうか?
小さな例を見ていただければ、一目瞭然です。
メイン.java :
public class Main {
public native int intMethod(int i);
public static void main(String[] args) {
System.loadLibrary("Main");
System.out.println(new Main().intMethod(2));
}
}
メイン.c :
#include <jni.h>
#include "Main.h"
JNIEXPORT jint JNICALL Java_Main_intMethod(
JNIEnv *env, jobject obj, jint i) {
return i * i;
}
コンパイルと実行 :
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
Ubuntu 14.04 で、Oracle JDK 1.8.0_45 でテストしました。
ということで、それが可能であることは明らかです。
- コンパイルされ動的にロードされたライブラリ(ここではCで書かれています)を、Javaから任意のアセンブリコードで呼び出す。
- そして結果をJavaに戻す
これは、次のように使うことができる。
- より良い CPU アセンブリ命令 (CPU ポータブルではない) を使用して、クリティカル セクションでより高速なコードを記述する。
- 直接システムコールを行う (OS 移植不可)
移植性の低下というトレードオフを伴う
C言語からJavaを呼び出すことも可能ですが、まずC言語でJVMを作成する必要があります。 C++からJavaの関数を呼び出すには?
GitHubでの例 を使って遊んでみてください。
関連
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
[解決済み] JVM起動時のパラメータ「-Xms」「-Xmx」とは何ですか?
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] Java の assert キーワードは何をするのか、そしていつ使うべきなのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse問題 アクセス制限。タイプ 'SunJCE' が API でないことを解決し、/jdk ディレクトリにある /jre と jre の違いについて理解を深める。
-
Java の switch case 文で必要な定数式の問題の解決法
-
Jsoup-Crawlingの動作
-
無効なメソッド宣言
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
API の戻り値を処理するために ResponseEntity を使用する
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
テストが空であるかどうかを判断するためのオプションの処理
-
[解決済み] Java の native キーワードは何のためにあるのですか?