導航:首頁 > 編程語言 > javalinuxso

javalinuxso

發布時間:2022-09-04 22:23:05

A. linuxjava怎樣調用普通的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!」輸出了。

B. 關於Linux中的so文件

你知道windows下的dll文件嗎???
其實和linux下的so文件是一回事,,so文件也是編譯好了的二進制的鏈接庫文件,,,
一般來說都是c或c++編譯出來的,,java的話通常是用的位元組碼,也就是class文件。。
你自己寫一個 helloworld的c程序,然後在命令行下用編譯器編譯gcc -c helloworld.c -o hello.o這樣編譯出來的結果就是那樣的東西了。。這樣的文件是不能直接運行的。。

C. linux上使用java載入so動態庫報錯

1、編寫 java 類,先上代碼

[html] view plain
package com.hongquan.jni;

public class HelloJNI {

// 聲明 so 庫中的方法
public native static String sayHi(String name);

// 載入 so 動態鏈接庫
static {
System.load("/home/hongquan/main.so");
}

// java 類入口函數

D. java jnative 調用 dll,在Linux環境下用的是.so文件,請問.so文件應該放在什麼路徑下 高分!急!

在/usr/lib下面就可以

一般就幾個目錄 /lib /usr/lib /usr/local/lib


在/etc/env.d/目錄下有文件定義這些搜索庫的路徑

比如 00basic 中就有這么一句

LDPATH='/lib64:/usr/lib64:/usr/local/lib64:/lib32:/usr/lib32:/usr/local/lib32:/lib:/usr/lib:/usr/local/lib'

當然我用的版本是gentoo,是這樣,大多數應該一樣吧


你也可以放到自己的文件夾里,然後把文件夾名加到env.d下的文件里去

E. java jni 怎麼在windows環境中編譯成linux下的so文件

可以直接在android工程下使用,因為android就是linux內核。

F. linux上部署java項目,調用sh腳本啟動java Main方法程序,找不到對應的so文件!

如果未設置JAVA_HOME環境變數,需要手動指定
#JDK所在路徑
JAVA_HOME=/root/JDK/jdk1.6.0_24
RUNNING_USER、APP_HOME、APP_MAINCLASS、CLASSPATH根據自己項目的情況修改即可。
如果在windows下編輯上傳到linux,注意用dos2unix命令轉換文件格式,不然會報錯。

G. linux so是什麼 文件

.so文件代表Linux的共享函數庫文件,程序運行時可能會使用到裡面的函數代碼。當一個程序需要.so共享函數庫文件時,系統自動會把它載入到內存中使用。相當於Windows系統裡面的dll動態鏈接庫文件。

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

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

I. windows 下使用eclipse java程序調用在linux下生成的.so文件

不能。windows只能調用windows的dll文件。如果一定要調用so,只好在linux下面測試哦。
或者在windows下面寫一個與so對等的dll。

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

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

閱讀全文

與javalinuxso相關的資料

熱點內容
運籌演算法工程師 瀏覽:588
國產電影推薦動作大片 瀏覽:616
什麼app不用網路也可以玩 瀏覽:313
程序員必備知識 瀏覽:601
程序員東西沒做完不讓走 瀏覽:603
尼克電影 瀏覽:212
程序員的職業道德 瀏覽:89
圖的遍歷演算法的原理 瀏覽:651
eclipsegpu編譯 瀏覽:376
啄木鳥出品電影 瀏覽:184
金莎朗的完整電影 瀏覽:908
安卓吃雞開槍圖標怎麼那麼大 瀏覽:86
app怎麼搜不到呢 瀏覽:883
30台伺服器怎麼做負載 瀏覽:726
周迅生死劫電影在哪可以看 瀏覽:118
java生成class文件 瀏覽:321
程序員真的不能去外包嗎 瀏覽:771
用ADS編譯wince 瀏覽:580
linuxopencreat 瀏覽:678
壓縮機如何找平 瀏覽:618