java代碼編譯so,java代碼編譯smali

如何把JAVA工程 編譯成.SO文件

1,寫一個java文件,聲明一個native 方法,例如public native void test(); 2,把它編譯成class文件 3,使用javah 這個class來生成cpp的頭文件 4,實現頭文件里面那些函數 4,用ndk編譯生成動態庫 其中1,想生成幾個就寫幾個native方法。

創新互聯主要從事網站制作、網站建設、網頁設計、企業做網站、公司建網站等業務。立足成都服務修武,10多年網站建設經驗,價格優惠、服務專業,歡迎來電咨詢建站服務:028-86922220

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

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

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編譯步驟:

選擇 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 就運行正常啦。

關于Android開發中Java對于.so庫的調用

android掉用c的so包就是通過jni

應該給你的jar包就是用來調用so包的

。不會讓你直接掉so包的放心。so包一般都是為了保證核心代碼不被反編譯

,另外就是效率高才會用,或者就是開發游戲

他們說夠用應該是jar包已經和so包的jni調用接口都調好了

你用jar包就行了

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!”輸出了。

本文名稱:java代碼編譯so,java代碼編譯smali
文章轉載:http://m.kartarina.com/article48/hsdiep.html

成都網站建設公司_創新互聯,為您提供關鍵詞優化App設計Google商城網站小程序開發服務器托管

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設
主站蜘蛛池模板: 亚洲精品无码成人片在线观看 | 精品久久久无码人妻字幂| 久久久人妻精品无码一区| 亚洲韩国精品无码一区二区三区 | 国产精品无码一区二区三级| 久久久久亚洲av无码专区蜜芽| 亚洲的天堂av无码| 亚洲一本大道无码av天堂| 精品无码国产自产拍在线观看| 精品国产AV无码一区二区三区| 日韩精品无码一本二本三本| 69成人免费视频无码专区| 亚洲av中文无码乱人伦在线播放| 亚洲人成网亚洲欧洲无码| 国99精品无码一区二区三区| 激情无码亚洲一区二区三区| 久久午夜伦鲁片免费无码| 亚洲区日韩区无码区| 国产精品无码一区二区在线观 | 亚洲av永久无码天堂网| 亚洲色中文字幕无码AV| 人妻无码中文字幕免费视频蜜桃| 东京热av人妻无码专区| 狠狠躁天天躁无码中文字幕 | 无码粉嫩虎白一线天在线观看| 中文午夜乱理片无码| 亚洲国产av无码精品| 丰满少妇人妻无码专区| 亚洲午夜无码久久久久软件| 无码精品A∨在线观看| 亚洲一区爱区精品无码| 久久久久成人精品无码| 亚洲精品无码久久久| 无码人妻精一区二区三区| 亚洲中文字幕无码中文字| 亚洲AV无码专区在线亚| 台湾无码一区二区| 麻豆国产精品无码视频| 久久亚洲AV成人无码软件| 麻豆国产精品无码视频| 人妻少妇伦在线无码专区视频|