編譯jni
『壹』 android studio怎麼編譯帶so庫的jni
安裝android-ndk
將生成.so文件的源代碼添加到android工程中的jni目錄下(如果沒有則新建)
在jni目錄下編寫編譯文件(一個.mk文件,這個類似於linux的make文件,一句話解釋不了,自己可以查一下)
然後打開cmd,cd進入你android工程目錄下。然後輸入「ndk-build"回車就會編譯出.so文件。會根據不同的處理器生成四個.so文件
『貳』 win7下編譯jni過程 報錯,報錯內容為Permission denied make: ***
LZ你是用cywine編譯的嗎,是的話,不妨先獲取root許可權再執行編譯命令
『叄』 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 自帶的例子 hello-jni ,位於E:android-ndk-r5sampleshello-jni( 根據具體的安裝位置而定 ) 。
2.運行 cygwin ,輸入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,進入到 E:android-ndk-r5sampleshello-jni 目錄。
3.輸入 $NDK/ndk-build ,執行成功後,它會自動生成一個 libs 目錄,把編譯生成的 .so 文件放在裡面。 ($NDK是調用我們之前配置好的環境變數, ndk-build 是調用 ndk 的編譯程序 )
4.此時去 hello-jni 的 libs 目錄下看有沒有生成的 .so 文件,如果有,ndk 就運行正常啦。
NDK編譯步驟:
『肆』 如何在eclipse中用ndk編譯jni
工具:
eclipse
步驟
1、右鍵要編譯jni的工程,點擊
2、簡單使用NDK編譯
3、點擊new添加以個編譯器
4、簡單使用NDK編譯
5、填好相關路徑參數
6、簡單使用NDK編譯
7、勾選如下選項
8、簡單使用NDK編譯
9、勾選如下選項
10、簡單使用NDK編譯
11、點擊右下角的按鈕
12、簡單使用NDK編譯
13、選擇要編譯的工程
14、簡單使用NDK編譯
15、最後勾上新建的這個編譯器
『伍』 Android用NDK和整套源碼下編譯JNI的不同
2. 注冊函數的方法是不同的。舉例說,在com/evan129/jnitest/jniutils.java有個native int foo()方法,需要在jni中實現
在ndk中,只要實現這個函數,然後函數名是以jint java_com_evan129_jnitest_jniutils_foo(jnienv* env, jobject thiz) 命名既可。也就是說,如果jni只要實現這個函數,並且功能也很簡單的話,那麼jni c/cpp文件里只需要這一個函數就完事了。
但在android源碼中編譯jni代碼是不同的,jni中的函數名無所謂。不過至少還需要加一個
jniexport jint jnicall jni_onload(javavm* vm, void* reserved)方法,這個方法可以找個現有的復制一把就行,檢查運行環境的。然後主要是這個方法中會調用(*env).registernatives函數,在這里把jni中的方法和java文件中的方法關聯起來。
3. 有個很詭異的區別,自動傳入的jnienv* env好像不是一個東西。因為在android源碼中使用這個env一般是如env->newstringutf(…),而ndk中sample里的一處是(*env)->newstringutf(…) 這env和*env差很大。但兩處函數傳入的都是jnienv* env,只能懷疑jnienv的定義是不是都是不同的。
『陸』 eclipse會自動調用ndk-build編譯jni嗎
一、寫好c代碼後,然後用cygwin搭建ndk-build環境,用ndk-build來編譯出相關的.so文件(libs目錄)之後,
再用eclipse里去編譯java程序,從而使用.so文件。該方法在上一篇搭建NDK環境有介紹。
二、利用eclipse完全可以達到編譯.so的目的。
首先,先裝上CDT吧,這是Eclipse的C/C++環境插件,裝上它後你就可以在Eclipse里創建C/C++項目和代碼文件了。插件的安裝有兩種方式,一種是在線安裝,一種是下載安裝包自己安裝,這里只介紹第一種方式,另一種方式可自行網路。首先登錄http://www.eclipse.org/cdt/downloads.php,找到對應你Eclipse版本的CDT插件的在線安裝地址,如下圖所示:,找到對應你Eclipse版本的CDT插件的在線安裝地址,如下圖所示:
2、找到對應你
eclipse版本的CDT插件地址,之後打開Eclipse,點Help菜單,找到Install New
Software菜單,注意一些老版本的Eclipse菜單不太一樣,比如說Europa的版本,就是Help--Software
Updates—Find and Install--Search for new features to install--New Remote
Site,除了菜單不太一樣外,安裝方式都差不多,可自行網路一下,下圖以Indigo版本為准:
3、把取的地址填進去,出來插件列表後,選Select All,如下圖所示:
然後狂點下一步即可完成安裝。
也可以點擊Add按鈕用離線方法安裝。出現該對話框,點擊Archive按鈕,選擇之前下載的離線安裝包,安裝過程同在線安裝。
4、安裝完成後,點菜單File-New-Project,出現新建項目界面,如果出現了C/C++項目,那麼恭喜你,CDT安裝也完成了,如下圖所示:
5、
不過光有CDT還不行,CDT編譯代碼還是需要調用cygwin當中的編譯工具進行,所以我們還需要手動配置C/C++的編譯器,還是以NDK自帶的
hello-jni為例子,首先打開
Eclipse,File->New->Project->Android->Android
project->next,在New Android Project選項卡中,選Create project from existing
source;在Location:按Browse找到NDK自帶的Hello-jni目錄。
選擇Android SDK版本後,點擊Finish,完成導入。
6、 把這個項目導入進來,導入後如下圖所示:
7、 編譯C文件:
右鍵單擊HelloJni之後,點擊Properties,彈出配置界面,之後再點擊Builders,如下圖所示:
點擊New按鈕,新添加一個編譯器,點擊後出現添加界面,選擇Program,點擊OK:
8、 點擊OK後,出現了添加界面:
在Main Tab界面, 填充以下內容:
Name:
編譯器名稱,隨便填寫。如:NDK_Builder
Location:
可執行工具的位置。即NDK安裝目錄下ndk-build.cmd的位置。
你可以點擊Browser File System...按鈕選擇Android NDK安裝目錄下的ndk-build.cmd文件來指定Location。如下圖:
你也可以設置一個變數來指定Android NDK的安裝目錄後設置Location。點擊Variables按鈕指定。如下圖:
出現選擇Variable的選擇框。
單擊Edit Variables...按鈕。出現Variable管理的界面。單擊New按鈕添加Variable。
輸入Variable的名稱,如:ndk_home。然後單擊Browse...按鈕,選擇Android NDK的安裝目錄後,單擊OK。
至此,NDK的Variable設置完成。
然後,單擊Main Tab界面上Location的Variables...按鈕,選擇剛才設置的ndk_home變數。如下圖:
單擊OK後,在Location的編輯框里會有選擇的ndk-home變數,在其後面添加上/ndk-build.cmd,OK,Location設置完成。
如下圖:
Working Directory:
要編譯的C/C++程序的工作目錄。一般指定到jni文件夾,因為所有的C/C++程序都在該文件夾內實現。
首先選擇Working Directory里的Browse Workspace...按鈕,如下圖:
然後,選擇要編譯的項目HelloJni的jni文件夾。
9、 接著切換到Refresh選項卡,給Refresh resources upon completion打上鉤,選擇The Project containing the selected resource項,
表示只更新包含選中資源的項目,選中的資源項就是Main Tab選擇的jni文件夾。
完成後如下圖:
10、 最後切換到Build Options選項卡,勾選During auto builds,如下圖所示:
Specify Resources 按鈕單擊後,選擇HelloJni項目的 jni 文件夾。
11、單擊 Apply OK 確認設置後,確保此 NDK 構建工具設置為列表中的第一個條目,方法是選擇 Up 按鈕,直到其位於 Builders 列表的頂部
記得一定要點Up按鈕,把它排到第一位,否則C代碼的編譯晚於Java代碼的編譯,會造成你的C代碼要編譯兩次才能看到最新的修改,排到第一位後如下圖所示:
12、 現在再次恭喜你,編譯配置也配置完成啦,那麼來試試看是否可以自動編譯吧,打開左側jni目錄里的hello-jni.c文件把提示Hello from JNI!改改,如下圖所示:
單擊項目,選擇Build Project後,在HelloJni項目下會多出libs文件夾,.so文件就存放在這里。
另外在Console控制台會輸出成功編譯的提示信息。
編譯之後點擊run按鈕跑起來看看吧,如果模擬器當中出現了你新修改的提示信息,那麼再一次恭喜你,已經全部配置成功了!
『柒』 android studio 編譯jni 跟工程有關嗎
1 在交叉編譯的時候怎麼都無法生成so文件,javah生成頭文件沒錯,c文件也沒錯,java文件也沒錯,
2.原因:是JNI文件夾路徑不對
3 在執行javah命令時,我進入的是cd app/src/main/java 這樣jni文件夾在java文件夾下,作為一個包存在,這樣就無法生成so文件
執行javah的正確姿勢:
4 進入app/src/main目錄:cd app/src/main
執行javah命令:javah
javah -d jni -classpath ./Java lab.sodino.jnitest.MainActivity
5, -d jni 頭文件生成到jni文件夾(當前在<Project>\app\src\main目錄下,所以.h所在的目錄為<Project>\app\src\main\jni )
-classpath ./java 指定去當前路徑下java下尋找包名指定的類
這樣再rebuild一下,就會生成so文件了
『捌』 windows編譯jni動態庫 生成的文件在哪
執行編譯操作:
編譯通過後將在app\build\intermediates\classes\debug\cn\net\shuihan\myapplication目錄下產生文件TestA.class
產生Jni頭文件:
通過Alt +F12打開terminal窗口,在命令行輸入cd app/src/main
『玖』 android studio 怎麼編譯jni
一、使用已經編譯好的so
這種情況比較件簡單,只要把的.so文件放到相應的目錄即可。如下:
.[mole_name]
. . [src]
. . .[main]
. . . .[jniLibs]
. . . . .[armeabi]
. . . . .[armeabi-v7a]
. . . . .[x86]
. . . . .[mips]
注意 jniLibs 目錄是放在 mole 下面,在Android Studio中效果如下,這樣編譯之後so就會被自動打包進apk,代碼中直接 loadLibrary即可了:
1 String libName = "helloNDK"; // 庫名, 注意沒有前綴lib和後綴.so
2 System.loadLibrary( libName );
二、使用C/C++源碼
1 r9d以上版本NDK
首先確保自己的NDK版本在r9d以上,目前最新可以拿到的是r10,下載地址:
http://tools.android-studio.org/
感謝 Android Studio中文組的無私奉獻。
如果低於r9d版本,Android studio 下ndk編譯會出現 No rule to make target 的錯誤。
2 配置 ndk.dir
在 local.properties 添加如下配置:
sdk.dir=/path/to/android-sdk
ndk.dir=/path/to/android-ndk
『拾』 用cygwin編譯JNI文件夾中的文件時,如何在JNI里建立子目錄
沒有人回答啊,小弟自己已經解決了,主要是寫Android.mk文件,用LOCAL_C_INCLUDES
:=LOCAL_C_INCLUDES
+=來解決,這樣編譯器就知道你設置的路徑了