導航:首頁 > 操作系統 > linuxjava調用so

linuxjava調用so

發布時間:2024-10-13 06:20:29

linux環境java如何調用so文件

用JNI實現
實例:

創建HelloWorld.java
class HelloWorld
{
private native void print();
public staticvoid main(String[] args)
{
new HelloWorld().print();
}

static
{
System.loadLibrary("HelloWorld");
}
}
注意print方法的聲明,關鍵字native表明該方法是一個原生代碼實現的。另外注意static代碼段的System.loadLibrary調用,這段代碼表示在程序載入的時候,自動載入libHelloWorld.so庫。
編譯HelloWorld.java
命令行中運行如下命令:
javac HelloWorld.java
在當前文件夾編譯生成HelloWorld.class。
生成HelloWorld.h
在命令行中運行如下命令:
javah -jni HelloWorld
在當前文件夾中會生成HelloWorld.h。打開HelloWorld.h將會發現如下代碼:
/* 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的聲明。這裡麵包含兩個參數,非常重要,後面講實現的時候會講到。
實現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函數需要改變調用對象成員變數時,可以通過操作這個對象來完成。
編譯生成libHelloWorld.so
在Linux下執行如下命令來完成編譯工作:
cc -I/usr/lib/jvm/java-6-sun/include/linux/
-I/usr/lib/jvm/java-6-sun/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。鏈接的時候只需要提供庫名就可以了。
運行Java程序HelloWorld
大功告成最後一步,驗證前面的成果的時刻到了:
java HelloWorld
如果你這步發生問題,如果這步你收到java.lang.UnsatisfiedLinkError異常,可以通過如下方式指明共享庫的路徑:
java -Djava.library.path='.' HelloWorld
當然還有其他的方式可以指明路徑請參考《在Linux平台下使用JNI》。
我們可以看到久違的「Hello world!」輸出了。

❷ 請問我有一個.so文件,如何在Linux下編程使用呢

-lxx

xx是你的.so文件名

其實使用方法和你使用數學庫函數是一樣的,源代碼中添加

#include <math.h>,編譯的時候,加上-lm參數。

註:linux下的.so文件為共享庫,相當於windows下的dll文件。

(2)linuxjava調用so擴展閱讀:

linux下編寫調用so文件實例

.so是Linux(Unix)下的動態鏈接庫. 和.dll類似.

比如:

文件有: a.c, b.c, c.c

gcc -c a.c

gcc -c b.c

gcc -c c.c

gcc -shared libXXX.so a.o b.o c.o

要使用的話也很簡單. 比如編譯d.c, 使用到libXXX.so中的函數, libXXX.so地址是MYPATH
gcc d.c -o d -LMYPATH -lXXX

注意不是-llibXXX

test.c文件和一個test.h,這兩個文件要生成libsotest.so文件。然後我還有一個testso.c文件,在這個文件裡面調用libsotest.so中的函數。

編寫的過程中,首先是編譯so文件,我沒有編寫makefile文件,而是參考的2裡面說的直接寫的gcc命令。

因為so文件裡面沒有main函數,所以是不可執行的,所以編譯的時候要加上-c,只生成目標文件。

❸ 在Linux上部署Java web項目,直接在main函數中調用so文件成功,但是部署到to

是路徑的問題,之前你的沒有webroot路徑,系統找不到你的工程,所以會報404錯誤,404錯誤就是因為找不到文件,系統默認先找webroot 然後再找你的工程,你現在把webroot也傳上去了,當然就能夠找到你的工程了

❹ 什麼是linux中的SO動態庫

so動態鏈接庫是對它有依賴關系的程序運行時需要調用的,可以通過命令:
ldd 「程序名字」來查看程序調用了哪些動態鏈接庫,系統默認會自動載入/usr/lib/ 等目錄下的動態鏈接庫,如果是源碼安裝的庫,它的動態鏈接庫文件會存在你自定義安裝的目錄的lib下,這時你需要修改/etc/ld.so.conf文件來指定動態鏈接庫的載入路徑,然後運行ldconfig命令來載入動態鏈接庫,ldconfig -v是查看那些動態鏈接庫已經被載入了

❺ linux java 調用C++方法 編譯動態庫文件.so時找不到jni.h

用 sudo find / -name jni.h -print
命令,就會打出路徑

閱讀全文

與linuxjava調用so相關的資料

熱點內容
jar命令war包 瀏覽:121
福州交警app預約在哪裡簽字確認 瀏覽:623
android各版本sdk異同 瀏覽:726
怎樣在源碼中找精靈圖片 瀏覽:445
超聲波防盜51單片機 瀏覽:460
國內程序員編程能力 瀏覽:184
女程序員沒有晉升 瀏覽:136
微訂點單外賣平台系統源碼 瀏覽:572
雲伺服器30m 瀏覽:27
古裝程序員電視劇 瀏覽:182
愛因斯坦傳pdf 瀏覽:495
塊存儲和雲伺服器 瀏覽:352
吃東西的解壓生 瀏覽:916
如何把網頁上傳到web伺服器 瀏覽:243
外國超級解壓實驗 瀏覽:63
pdf閱讀器官方免費下載 瀏覽:46
禁止的命令 瀏覽:963
java設置button的大小設置 瀏覽:451
ios程序員提升方向 瀏覽:528
源碼封庫時引用的庫怎麼處理 瀏覽:524