Java JNI Принцип
JNI является важной функцией на стандартной платформе Java. Это компенсирует недостатки важного преимущества Java, независимого от платформы. В то время как Java является кроссплатформенным, она также может взаимодействовать с динамическими библиотеками других языков (таких как C и C ++), предоставляя другим языкам возможность воспроизводить свои преимущества.
При поддержке стандартной платформы Java режим JNI легче реализовать и использовать. Вот краткое изложение следующего графика знаний:
Пример:
Описание среды: Ubuntu 10.4.2 LTS System
Листинг программы 1: src/com/magc/jni/helloworld.java
/ ** * */ package com.magc.jni; / ** * @author MAGC * */ public class helloworld {static {System.LoadLibrary ("Hello"); } public Native void displayHello (); / ** * @param args */ public static void main (string [] args) {new helloworld (). DisplayHello (); }} Введите каталог SRC и составьте класс Java.
Команда: javac ./com/magc/jni/helloworld.java
Сгенерировать helloworld.class в каталоге, где находится Helloworld.java
Затем используйте Javah, чтобы сгенерировать файл заголовка.
Команда: javah -jni com.magc.jni.helloworld
Сгенерируйте файл заголовка com_magc_jni_helloworld.h в текущем каталоге. Этот файл используется программами C и C ++ для ссылки и реализации функций в нем.
Список программы 2: com_magc_jni_helloworld.h
/ * Не редактировать этот файл - он сгенерирован на машине */ #include <jni.h>/ * Заголовок для класса com_magc_jni_helloworld */ #ifndef _included_com_magc_jni_helloworld #define _included_com_magc_jni_helloworld #ifpine _included_com_magc_jni_helloworld #ifdefin #endif / * * class: com_magc_jni_helloworld * Метод: DisplayHello * Signature: () v * / jniexport void jnicall java_com_magc_jni_helloworld_displayhello (jnienv *, job); #ifdef __cplusplus} #endif #endif
Примечание. 1) Этот файл заголовка не требует компиляции пользователя и непосредственно используется для ссылки другими программами C и C ++.
2) Метод JAVA_COM_MAGC_JNI_Helloworld_displayHello (jnienv *, jobject) в этом файле заголовка является интерфейсом для взаимодействия с библиотеками динамических ссылок в будущем, и имя должно быть последовательным.
Листинг 3 программы: src/jni_helloworldimpl.cpp
#include <jni.h> #include "com_magc_jni_helloworld.h" #include <stdio.h> jniexport void jnicall java_com_magc_jni_helloworld_displayhello (jnienv *env, job obj) {printf ("from jni_hello (jnienv *env, ob obj) {printf (" from jni_hello printf ("Привет, мир! /n"); возвращаться;} Этот файл C ++ реализует функции в приведенном выше файле заголовка, обратите внимание, что имена функций метода должны быть последовательными.
Скомпилировать и генерировать динамическую библиотеку Libhello.so,
Команда: g ++ -shared -i/usr/lib/jvm/java -6 -openjdk/include jni_helloworldimpl.cpp -o libhello.so
После успеха в текущем каталоге будет генерироваться файл динамической библиотеки ссылок Libhello.so.
С динамической библиотекой конкретных реализаций вы можете запустить Java, чтобы вызвать нативный метод класса программы JNI.
Команда: java -djava.library.path =. com.magc.jni.helloworld
Результат ввода: от jni_helloworldimpl.cpp: Hello World!
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!