接口文檔示例,JNI接口簡單示例

 2023-12-25 阅读 27 评论 0

摘要:JNI是Java native interface的簡寫,可以譯作Java原生接口。Java可以通過JNI調用C/C++的庫,這對于那些對性能要求比較高的Java程序無疑是一個福音。 下面我就用JNI實現一個經典的“Hello World”程序。該程序在Java中通過JNI調用c函數實現“Hello World”

JNI是Java native interface的簡寫,可以譯作Java原生接口。Java可以通過JNI調用C/C++的庫,這對于那些對性能要求比較高的Java程序無疑是一個福音。

下面我就用JNI實現一個經典的“Hello World”程序。該程序在Java中通過JNI調用c函數實現“Hello World”的輸出。創建該程序分為以下步驟:

1、創建一個Java程序(HelloWorld.java)定義原生的c/c++函數。

接口文檔示例?2、用javac編譯HelloWorld.java生成HelloWorld.class。

3、用javah帶-jni參數編譯HelloWorld.class生成HelloWorld.h文件,該文件中定義了c的函數原型。在實現c函數的時候需要。

4、創建HelloWorld.c,實現HelloWorld.h定義的函數。

5、編譯HelloWorld.c生成libHelloWorld.so。

jni編程?6、在java虛擬機運行java程序HelloWorld。

下面我們就一步一步來實現這個程序。

1、創建HelloWorld.java

class HelloWorld
{
private native void print();
public static void main(String[] args)
{
new HelloWorld().print();
}

怎么寫接口給別人調用。static
{
System.loadLibrary(“HelloWorld”);
}
}

注意print方法的聲明,關鍵字native表明該方法是一個原生代碼實現的。另外注意static代碼段的System.loadLibrary調用,這段代碼表示在程序加載的時候,自動加載libHelloWorld.so庫。

2、編譯HelloWorld.java

在命令行(帶java環境的linux系統,如ubuntu)中運行如下命令:
javac HelloWorld.java
在當前文件夾編譯生成HelloWorld.class。

JAVA接口例子?3、生成HelloWorld.h

在命令行中運行如下命令:

javah -jni HelloWorld

在當前文件夾中會生成HelloWorld.h。
打開HelloWorld.h將會發現如下代碼:

g代碼程序簡單示例?/* DO NOT EDIT THIS FILE - it is machine generated /
#include <jni.h>
/
Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern “C” {
#endif
/*

  • Class: HelloWorld
  • Method: print
  • Signature: ()V
    */
    JNIEXPORT void JNICALL Java_HelloWorld_print
    (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

該文件中包含了一個函數Java_HelloWorld_print的聲明。這里面包含兩個參數,非常重要,后面講實現的時候會講到。

jlink接口定義?4、實現HelloWorld.c
創建HelloWorld.c文件輸入如下的代碼:

#include <jni.h>
#include <stdio.h>
#include “HelloWorld.h”

JNIEXPORT void JNICALL

Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf(“Hello World!\n”);
}

注意必須要包含jni.h頭文件,該文件中定義了JNI用到的各種類型,宏定義等。

另外需要注意Java_HelloWorld_print的兩個參數,本例比較簡單,不需要用到這兩個參數。但是這兩個參數在JNI中非常重要。

env代表java虛擬機環境,Java傳過來的參數和c有很大的不同,需要調用JVM提供的接口來轉換成C類型的,就是通過調用env方法來完成轉換的。

obj代表調用的對象,相當于c++的this。當c函數需要改變調用對象成員變量時,可以通過操作這個對象來完成。

5、編譯生成libHelloWorld. so

在Linux下執行如下命令來完成編譯工作:
cc -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/linux/ -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ -fPIC -shared -o libHelloWorld.so HelloWorld.c

在當前目錄生成libHelloWorld .so。注意一定需要包含Java的include目錄(請根據自己系統環境設定),因為Helloworld.c中包含了jni.h。
另外一個值得注意的是在HelloWorld.java中我們LoadLibrary方法加載的是“HelloWorld”,可我們生成的Library卻是libHelloWorld。這是Linux的鏈接規定的,一個庫的名字必須要是:lib+庫名+ .so。鏈接的時候只需要提供庫名就可以了。

6、運行Java程序HelloWorld
在Linux下執行如下命令來:
java HelloWorld

如果你這步發生問題,如果這步你收到java.lang.UnsatisfiedLinkError異常,可以通過如下方式指明共享庫的路徑:

java -Djava.library.path=’.’ HelloWorld

這樣就可以看到“Hello world!”輸出了。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/194831.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息