Android Studio下jni应用
最近在將一個小應用從eclipse開發(fā)遷移到android studio,程序中有native代碼實現(xiàn),在eclipse是靠Android.mk這么個mk文件來組織編譯的,但到android studio上就不行了,因其是靠gradle組織,所以makefile里的配置要轉(zhuǎn)換為build.gradle里的語句(盡管實際上gradle也是組織一個mk文件),同時在遷移過程中遇到了一些問題,這里記錄一下,以備后查。
Android的JNI開發(fā)主要有兩中情況:一種是使用已經(jīng)編譯好的.so動態(tài)庫;一種是使用c/c++源代碼開發(fā)。下面分別介紹:
一、使用已經(jīng)編譯好的so
? ??這種情況比較件簡單,只要把的.so文件放到相應的目錄即可。如下:
? ? ? ? ?.[module_name]
? ? ? ? ?. . [src]
? ? ? ? ?. . .[main]
? ? ? ? ?. . . .[jniLibs]
? ? ? ? ?. . . . .[armeabi]
? ? ? ? ?. . . . .[armeabi-v7a]
? ? ? ? ?. . . . .[x86]
? ? ? ? ?. . . . .[mips]
注意?jniLibs?目錄是放在?module?下面,在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編譯會出現(xiàn) ?No rule to make target 的錯誤。?
2?配置?ndk.dir
在?local.properties?添加如下配置:
? ? ?sdk.dir=/path/to/android-sdk
? ? ?ndk.dir=/path/to/android-ndk
黃色部分修改為你本機的實際情況,如我的是:
?
sdk.dir=D\:\\android-sdk-windows ndk.dir=D\:\\android-ndk?
?
?
3 app下的build.gradle配置NDK模塊
android { compileSdkVersion 19buildToolsVersion "20.0.0"defaultConfig {applicationId "com.example.ndksample"minSdkVersion 9targetSdkVersion 19 versionCode 1 versionName "1.0" ndk { moduleName "helloNDK" // <-- This is the name of my C++ module! } } // ... more gradle stuff here ... } // end of android sectionndk?還可以配置更多選項,如下:
ndk { moduleName "myEpicGameCode"cFlags "-DANDROID_NDK -D_DEBUG DNULL=0" // Define some macrosldLibs "EGL", "GLESv3", "dl", "log" // Link with these libraries! 在這里添加你原先在makefile里ldlibs所鏈接的庫 stl "stlport_shared" // Use shared stlport library }?
?
4?添加C/C++源代碼
默認情況下,你需要把C/C++源代碼放在?[module]/src/main/jni/?路徑下。效果如下圖所示:
當然,也可以自定義源代碼路徑:
android {// .. android settings .. sourceSets.main {jni.srcDirs 'src/main/source' } }?
?
這里有一點需要注意,目前windows上android studio 下ndk編譯有一個bug,就是如果你的源文件(.C和.cpp文件,不算.h)只有一個,那么最后也會有編譯error,目前google還沒有修復,暫時的解決辦法是,新建一個空的.c文件放在那里,就可以編譯通過了。。。。有點奇葩!!
?
5?分平臺配置編譯
這一步不是必須的,你可以根據(jù)需要,對各個平臺進行不同的編譯配置,可以設置覆蓋前面的編譯選項(例如?cFlags?)。例如你只想編譯指定平臺的.so,而不是所有的平臺。如下:
android {// .. android settings .. productFlavors {x86 {ndk {abiFilter "x86"}}arm {ndk {abiFilter "armeabi-v7a" } } mips { ndk { abiFilter "mips" } } } } // android?
?
參考鏈接:
http://www.race604.com/android-studio-with-ndk/?utm_source=tuicool
http://blog.csdn.net/sodino/article/details/41946607
http://www.dewen.io/q/17530/Android+Studio+NDK%E5%BC%80%E5%8F%91%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5%E5%87%BA%E9%94%99%E9%97%AE%E9%A2%98
轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/6149516.html
總結
以上是生活随笔為你收集整理的Android Studio下jni应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql中字段类型不一致导致索引无效
- 下一篇: [openstack]依赖提交