最好把頭文件與so一起打包,當然你知道裡面介面的定義的話頭文件也不需要
linux版本專太多(redhat,屬centos,ubuntu,solaris.....),各個版本之間有差異別的電腦相同版本的linux系統的話應該能用,如果系統不一樣不行
② 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!」輸出了。
③ linux生成文件中.so 文件和.out文件的區別
.so是二進制格式的鏈接庫文件,包含鏈接庫源文件(.c)中的各函數實現、調試信息等。
.out一般也是由gcc編譯生成的二進制格式文件,但有可能是執行程序也可能是鏈接庫文件,因為在linux中擴展名除了一些特殊的約定,一般情況下是無意義的。
執行文件也分動態鏈接還是靜態鏈接。大多數情況都是動態鏈接,裡面存放源文件(.c)中編譯後的二進制代碼及所調用函數庫的入口參數,靜態鏈接則是all-in-one,就是將所用到的非標准庫都打包到執行文件中,所以體積都較大。
④ linux 怎麼編譯.so文件
.so是linux用的 所以 要生成so 需要用gcc 和生成可執行文件類似,只是增加一些編譯選項 命令如下內 gcc SOURCE_FILES -fPIC -shared -o TARGET SOURCE_FILES可以容是.c文件,也可以是經過-c編譯出來的.o文件 TARGET為so文件。
⑤ linux so是什麼 文件
.so文件代表Linux的共享函數庫文件,程序運行時可能會使用到裡面的函數代碼。當一個程序需要.so共享函數庫文件時,系統自動會把它載入到內存中使用。相當於Windows系統裡面的dll動態鏈接庫文件。
⑥ linux的C編程,怎麼使用so文件
linux下的.so文件為共享庫,相當於windows下的dll文件,使用方法如下:
在你的工程源代碼里包含.h頭文件,然後可以調用動態庫里的函數,在鏈接的時候加上如下編譯器參數:
-l xx.so
如果你的so文件是以lib開頭的,還可以直接這樣使用:
-lxx
xx是你的.so文件名
其實使用方法和你使用數學庫函數是一樣的,源代碼中添加
#include <math.h>,編譯的時候,加上-lm參數。
⑦ Linux c++開發.so文件的使用
假設在linux上用gcc編譯程序,需要用下列編譯選項生成.so文件:
gcc -fPIC -shared
.so 文件安裝一般是在/usr/lib或者/usr/local/lib下,安裝後不需要絕對路徑即可使用。當然你也可以安裝到工程文件夾下面,不過很少有這么做的。使用時只需要dlopen()函數打開這個庫,用dlsym()函數將動態庫的函數體載入進來;同樣已載入的動態函數庫可以用dlclose()關閉。
詳細使用方法網路搜dlopen 即可。
⑧ 關於Linux中的so文件
你知道windows下的dll文件嗎???
其實和linux下的so文件是一回事,,so文件也版是編譯好了的二進制的權鏈接庫文件,,,
一般來說都是c或c++編譯出來的,,java的話通常是用的位元組碼,也就是class文件。。
你自己寫一個 helloworld的c程序,然後在命令行下用編譯器編譯gcc -c helloworld.c -o hello.o這樣編譯出來的結果就是那樣的東西了。。這樣的文件是不能直接運行的。。