編輯:關於Android編程
盡管Android Studio已經越來越流行了,但很多人還是習慣於Eclipse或源碼環境下開發JNI應用。筆者是從以前在學校參加谷歌大學學術合作項目的時候接觸JNI的,當時是為了模仿底層的方法實現一個功能,使用的是Eclipse,直到最近項目中需要用到SmartLink、AirKiss才又再次接觸到JNI,第一次使用Android Studio開發NDK,遇到不少彎路再次總結下,以期能幫助新手快速入門不再迷茫。
vcq9wLS199PDTkRLsuO1xKOsyrnTw9XiuPa5pL7fv8nS1Lrct72x47XEseDQtLrNtffK1EpOSbXEtPrC66Gj0vLOqkPT79HUsru/58a9zKijrNTaV2luZG93c8+1zbPPwsq508NOREux4NLr1NpMaW51eM/CxNzWtNDQtcS6r8r9v+ImbWRhc2g7Jm1kYXNoO1NPzsS8/qOsyKuzxlNoYXJlZCBPYmplY3Rzo6zG5Mq11sq+zcrH0ru20WOhomMrK7XEzbfOxLz+us3Ktc/WzsS8/rTysPyzydK7uPa/4qGjxL/HsEFuZHJvaWTPtc2zxL/HsNans9bS1M/Cxt/W1rK7zay1xENQVbzcubmjrMO/0rvW1rbU06bXxbj319S1xNOm08OzzNDytv69+NbGvdO/2kFCSaO6o6hBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlo6m2qNLlwcu2/r341sbOxLz+o6jTyMbkyscuc2/OxLz+o6nI57rO1MvQ0NTaz+DTprXEz7XNs8a9zKjJz6OstNPKudPDtcTWuMHuvK+jrMTatOa21Mbrtb2/ydPDtcTPtc2zuq/K/b/ioaM8L3A+DQpBUk12NSZtZGFzaDsmbWRhc2g7YXJtZWFiaSBBUk12NyAmbWRhc2g7Jm1kYXNoO2FybWVhYmktdjdhIEFSTXY4Jm1kYXNoOyZtZGFzaDthcm02NC0gdjhhIHg4NiZtZGFzaDsmbWRhc2g7eDg2IE1JUFMgJm1kYXNoOyZtZGFzaDttaXBzIE1JUFM2NCZtZGFzaDsmbWRhc2g7bWlwczY0IHg4Nl82NCZtZGFzaDsmbWRhc2g7eDg2XzY0DQo8cD7S1LG+yMtPRE2+rdHpwLTLtaOsxOPTprjDvqG/ycTctcTM4bmp16jOqsO/uPZBQknTxbuvuf21xC5zb87EvP6jrLWrsrvTprjDu+y6z9fFyrnTw6GjxOPTprjDzqrDv7j2QUJJxL/CvMzhuam21NOmtcQuc2/OxLz+oaO1sdK7uPbTptPDsLLXsNTayeixuMnPo6zWu9PQuMPJ6LG41qez1rXEQ1BVvNy5ubbU06a1xC5zb87EvP674bG7sLLXsKGj1Np4ODbJ6LG4yc+jrGxpYnMveDg2xL/CvNbQyOe5+7Tm1Nouc2/OxLz+tcQgu7CjrLvhsbuwstewo6zI57n7sru05tTao6zU8rvh0aHU8WFybWVhYmktdjdh1tC1xC5zb87EvP6jrMjnufvSsrK7tObU2qOs1PLRodTxYXJtZWFiacS/wrzW0LXELnNvzsS8/qOo0vLOqng4NsnosbjSstanILPWYXJtZWFiaS12N2G6zWFybWVhYmmjqaGjcHM6IE5hdGl2ZSBMaWJzIE1vbml0b3Ig1eK49tOm08O/ydLUsO/W+s7Sw8fA7b3iyta7+snPsLLXsLXEQVBL08O1vcHLxMTQqS5zb87EvP6jrNLUvLAuc2/OxLz+wLTUtNPaxMTQqbqvyv2/4rvy1d+/8rzcoaM8L3A+DQo8aDIgaWQ9"2jni">2、JNI
JNI 全稱Java Native Inteface,即Java本地接口,是Java中定義的一種用於連接Java和C/C++接口的一種實現方式。Java語言裝載到虛擬機中,不能和硬件交互,不能驅動開發。JNI擴展了Java虛擬機的能力,驅動開發、無線熱點共享,底層語言(C、C++)效率高,數學運算、實時渲染的游戲,音視頻處理等等,簡而言之,就是Java代碼調用c、c++代碼,JNI模式一共涉及到三個角色:C/C++ 代碼、本地方法接口類、Java層中具體業務類
命名規則
JNIExport jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,jobject thiz )
Java端加載so
System.loadLibrary("helloJni");//加載so文件,不要帶上前綴lib和後綴.soJava端的調用jni
((TextView)findViewById(R.id.jni_text)).setText(helloJni());
Gradle 是一個基於Apache Ant和Apache Maven概念的項目自動化建構工具。它使用一種基於Groovy的特定領域語言(DSL)來聲明項目設置。以往Android NDK開發需要在Eclipse或源碼環境下,建立並配置Android.mk和Application.mk,且還要通過java命令生成.h頭文件,才能編譯生成so庫。但在Android Studio中這些步驟都不需要,因為Gradle足夠強大,只需配置Gradle即可編譯生成so庫。
JNI代碼主要又分為Native代碼和Java代碼,所以我們得實現Native端和Java端
把NDK裡build目錄添加到path變量 ,比如我的目錄是D:\AndroidDevlopment\SDK\ndk-bundle
ndk{ moduleName "helloJni"//*生成的so文件名,必填 abiFilters "armeabi", "armeabi-v7a", "x86" //配置輸出的abi體系結構下的so庫, }
配置支持NDK
android.useDeprecatedNdk=true//是灰色的不影響
若不配置android.useDeprecatedNdk=true點擊腳本同步,之後會報這個錯誤
public class MainActivity extends AppCompatActivity { static { System.loadLibrary("helloJni");//加載so文件,不要帶上前綴lib和後綴.so } public native String helloJni();//定義本地方法接口,這個方法類似虛方法,實現是用c或者c++實現的 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
在我們定義了本地接口方法之後,我們在方法上按alt+Enter,然後生成對應的方法,可是不出意外的話生成的c文件只是有一個頭文件的,並沒有為我們生成對應的方法框架,
#include
如果你熟悉Jni的語法可以自己去實現,但是太麻煩了,幸好谷歌為我們提供了一個插件gradle-experimental,我們只需要在app下的gradle.build腳本裡配置(僅僅在我們生成jni方法框架時添加,當我們全部添加完JNI方法框架之後,必須注釋或者刪除掉,否則run的時候就絕對報錯)
gradle-experimental插件dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:24.2.1' compile 'com.android.tools.build:gradle-experimental:0.7.0'//僅僅在我們生成jni方法框架時添加,當我們全部添加完JNI方法框架之後,必須注釋或者刪除掉,否則run的時候就絕對報錯 }
配置成功了之後,再執行下腳本,把原來生成的jni文件夾刪除掉,再按萬能鍵,這時候就妥妥滴生成了c文件
#includeJNIEXPORT jstring JNICALL Java_crazymo_train_jnitraining_MainActivity_helloJni(JNIEnv *env,jobject instance){ // TODO return (*env)->NewStringUTF(env, "Hello Jni"); }
完整的Activity實現如下:
package crazymo.train.jnitraining; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; public class MainActivity extends AppCompatActivity { static { System.loadLibrary("helloJni");//加載so文件,不要帶上前綴lib和後綴.so } public native String helloJni();//定義本地方法接口,這個方法類似虛方法,實現是用c或者c++實現的 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ((TextView)findViewById(R.id.jni_text)).setText(helloJni());//調用JNI } }
一、 Service簡介 Service是android 系統中的四大組件之一(Activity、Service、BroadcastReceiver、ContentP
除非迫不得已,要不然不要在你的APP裡面使用數據庫,記不得是哪個書的話了!現在Android平台下的ORM框架very多,比如GreenDao,曾經寫過一篇關於Green
一.滑動界面:第一次啟動時除了啟動動畫外,可能還有著滑動功能介紹界面,現在記錄一下這種界面的實現方式,接著上篇啟動動畫之後的效果附加上。效果圖: 界面:&nb
Android開發四大組件分別是:活動(Activity):用於表現功能。服務(Service):後台運行服務,不提供界面呈現。廣播接收器(BroadcastReceiv