① linux下NDK編譯出的SO庫能在WIndows下的android工程直接使用么
可以直接在android工程下使用,因為android就是linux內核。
1.android的NDK開發需要在linux下進行: 因為需要把C/C++編寫的代碼生成能在arm上運行的.so文件,這就需要用到交叉編譯環境,而交叉編譯需要在linux系統下才能完成。
2.安裝android-ndk開發包,這個開發包可以在google android 官網下載: 通過這個開發包的工具才能將android jni 的C/C++的代碼編譯成庫
3.android應用程序開發環境: 包括eclipse、java、 android sdk、 adt等。
NDK編譯步驟:
1.選擇 ndk 自帶的例子 hello-jni ,位於E:\android-ndk-r5\samples\hello-jni( 根據具體的安裝位置而定 ) 。
2.運行 cygwin ,輸入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,進入到 E:\android-ndk-r5\samples\hello-jni 目錄。
3.輸入 $NDK/ndk-build ,執行成功後,它會自動生成一個 libs 目錄,把編譯生成的 .so 文件放在裡面。 ($NDK是調用我們之前配置好的環境變數, ndk-build 是調用 ndk 的編譯程序 )
4.此時去 hello-jni 的 libs 目錄下看有沒有生成的 .so 文件,如果有,ndk 就運行正常啦。
② linux下如何用c++編譯so文件,c語言又怎樣調用這個so文件
C++編譯so文件與C編譯so一樣都是加參數 -shared
C語言調用C++的so
首先C要調用的C++的函數必須是extern "C"聲明的。
其次編譯C程序時需要增加鏈接libstdc++.so(可能名字不打對自己查查)
③ Linux c++開發.so文件的使用
假設在linux上用gcc編譯程序,需要用下列編譯選項生成.so文件:
gcc -fPIC -shared
.so 文件安裝一般是在/usr/lib或者/usr/local/lib下,安裝後不需要絕對路徑即可使用。當然你也可以安裝到工程文件夾下面,不過很少有這么做的。使用時只需要dlopen()函數打開這個庫,用dlsym()函數將動態庫的函數體載入進來;同樣已載入的動態函數庫可以用dlclose()關閉。
詳細使用方法網路搜dlopen 即可。
④ Linux下fortran編譯鏈接
so文件是動態庫的集合,由f90文件編譯而成,此時f90程序中一般不包含program開頭的主程序,而只包含mole,例如:
將f90源文件編譯為動態庫時,使用命令
此時將生成兩個文件,分別為bisectmod.mod和lib***.so,這兒的***是剛才自定義的名字,而*.mod文件名則是f90文件中mole的名字,是自動生成的,如果一個f90文件中包含N個mole,則會生成N個*.mod和1個lib***.so。so文件作為庫文件,也可以由多個f90文件共同編譯得到,相當於靜態庫中的打包,將多個庫打包到一個里,如下:
動態庫的使用包含兩部分,一是在編譯時,二是在程序運行時。
編譯包含動態庫的主程序時,要同時制定mod文件的路徑和so文件的路徑,如果mod文件、so文件以及主程序文件在同一目錄下,直接指定so文件即可:
但是當使用第三方庫時,通常會分別存放在include和lib文件夾中,此時就要單獨指定路徑了:
第一個參數-I是大寫的i,代表include,第二個l是小寫的L,代表lib的名字,可以省略lib以及後面的.so,第三個-L則是lib.so文件的路徑。
這樣編譯的結果不能運行,因為運行時程序找不到lib***.so文件,最好的辦法是指定LD_LIBRARY_PATH環境變數,當然也可以將lib***.so文件復制到系統的lib文件夾中。
⑤ linux中把.c的文件編譯成.so
就跟用VS編譯dll或者lib文件差不多,把代碼編譯完成以後,命名為相應的後綴就好了。
例如:
gcc -c -fPIC libst.c
生成 libst.o
然後
gcc -shared -fPIC -o libst.so libst.o
生成 libst.so 動態鏈接庫
把libst.so拷貝到系統默認庫目錄下,比如 /lib, /usr/lib 下
假定有 test.c 要引用這個庫
gcc -lst -o test test.c
然後就可以了
假如不能把libst.so拷貝到默認庫目錄下,比方說放在了
/home/aaa/lib 下
那麼就用這樣的語句來編譯test.c
gcc -L/home/aaa/lib -lst -Wl,-rpath=/home/aaa/lib -o test test.c
⑥ 請問我有一個.so文件,如何在Linux下編程使用呢
-lxx
xx是你的.so文件名
其實使用方法和你使用數學庫函數是一樣的,源代碼中添加
#include <math.h>,編譯的時候,加上-lm參數。
註:linux下的.so文件為共享庫,相當於windows下的dll文件。
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中的so文件
你知道windows下的dll文件嗎???
其實和linux下的so文件是一回事,,so文件也是編譯好了的二進制的鏈接庫文件,,,
一般來說都是c或c++編譯出來的,,java的話通常是用的位元組碼,也就是class文件。。
你自己寫一個 helloworld的c程序,然後在命令行下用編譯器編譯gcc -c helloworld.c -o hello.o這樣編譯出來的結果就是那樣的東西了。。這樣的文件是不能直接運行的。。
⑧ 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!」輸出了。
⑨ 如何在windows環境下將.so編譯成.dll如果不行,在linux下的具體編譯過程是怎樣的望高手回答。。謝!
.so文件就已經是經過編譯的C程序
而.dll文件是編譯好的動態鏈接庫文件,需要用rundll32.exe來執行,或者載入shell執行。
所以.so和.dll不能互換。
在linux下面直接用gcc編譯器就能編譯。
命令格式:
gcc 文件名 C源碼文件名
例:
gcc 123.so 123.c
===========================================
.dll的就是已經編譯成功的了,不能再被編譯。
就像生孩子,已經是女孩了,你還能捅回去再換
個男孩出來?
===========================================
⑩ linux 怎麼編譯.so文件
.so是linux用的 所以 要生成so 需要用gcc 和生成可執行文件類似,只是增加一些編譯選項 命令如下 gcc SOURCE_FILES -fPIC -shared -o TARGET SOURCE_FILES可以是.c文件,也可以是經過-c編譯出來的.o文件 TARGET為so文件。