編輯:關於Android編程
在一篇博客中看到一篇文章,感覺描述的還可以:
在前面的博客中介紹的都是使用java開發Android應用,這篇博客將介紹java通過使用jni調用c語言做開發
為了更加形象的介紹jni,先觀察下面的圖片,下圖表示的是整個android系統架構
圖中從上到下的結構依次是:
Application:表示應用層,其實就是指android手機上的應用
Application Framework:表示應用框架層,我們平時用java開發app就是使用應用框架層提供的API做開發
Libraries:android類庫,使用C/C++開發的android類庫
Android Runtime:android運行環境
Linux Kernel:Linux內核
通過上圖可知Android系統分為五個部分,分別是Application(應用層)、Application Framework(應用框架)、Librarise(Android 類庫)、Android Runtime(Android 運行環境)、Linux Kernel(Linux內核),且android應用框架使用java開發的,android類庫使用c/c++開發的,為了使得java開發應用框架能調用c/c++開發的android類庫,android中引入了一個jni,通過jni可以實現java調用c/c++,c/c++調用java
開發jni需要准備的工具:
參考:android NDK的下載-文件太大
Android ndk,Android NDK的下載地址是:http://blog.csdn.net/DJY1992/article/details/51364430
下載完成後將ndk解壓的一個任意的目錄下,我解壓在D:\develop,建議文件目錄不要帶空格,解壓後將ndk所在的路徑添加到環境變量中
打開android ndk後,可以看到android ndk的目錄結構如下:
android ndk目錄結構介紹:
docs:幫助文檔
build/tools:linux的批處理文件
platforms:編譯c代碼需要使用的頭文件和類庫
prebuilt:預編譯使用的二進制可執行文件
sample:jni的使用例子
source:ndk的源碼
toolchains:工具鏈
ndk-build.cmd:編譯打包c代碼的一個指令
使用ndk實現一個簡單的Hello World程序
第一步:使用eclipse創建一個Android工程,並且將工程的名稱命名為HelloJni
第二步:修改activity_main.xml文件,在布局上添加一個按鈕點擊按鈕後調用c語言寫的代碼
<relativelayout android:layout_height="match_parent" android:layout_width="match_parent" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context=".MainActivity" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"><button android:layout_height="wrap_content" android:layout_width="wrap_content" android:onclick="click" android:text="調用c語言代碼"></button></relativelayout>第三步:在創建好的android工程下新建一個jni文件夾
第四步:在jni文件夾下新建一個hello.c文件,並在hello.c文件中添加下面的代碼
#include#include #include /*** * 第一個參數:java虛擬機的內存地址 * 第二個參數:調用helloFromC方法的java對象 */ Java_com_example_hellojni_MainActivity_helloFromC(JNIEnv* env, jobject obj) { //創建一個c語言的字符串,並且初始化字符串 char* arr = "hello world jni !"; //把c語言的字符串轉換成java的字符串 jstring jstr = (*env)->NewStringUTF(env, arr); //返回字符串 return jstr; }
第五步:在jni文件夾下新建一個Android.mk文件,並在Android.mk中添加下面的代碼
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #編譯生成的文件的類庫叫什麼名字 LOCAL_MODULE := hello #要編譯的c文件 LOCAL_SRC_FILES := Hello.c include $(BUILD_SHARED_LIBRARY)
第六步:編譯android ndk程序
1、打開命令行,並且進入到jni所在的目錄
2、輸入ndk-build.cml命令編譯android ndk
3、看到下圖所示的提示表示android ndk編譯成功
4、此時打開libs文件夾下的armeabi文件夾,可以看到armeabi文件夾下生成了一個libhello.so文件
這個就是Android ndk編譯後生成的文件,在後面就可以直接使用libhello.so文件
最後一步:使用通過ndk編譯好的,修改MainActivity.java文件
package com.example.hellojni; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { static { //加載打包完畢的so類庫 System.loadLibrary("hello"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //調用c語言代碼按鈕響應函數 public void click(View view) { //使用吐司對話框顯示c語言代碼中的函數helloFromC()的返回值 Toast.makeText(this, helloFromC(), Toast.LENGTH_SHORT).show(); } //定義一個本地方法,方法體由C語言實現 public native String helloFromC(); }
不得不說,作為一名安卓碼農,總是會有蛋蛋的憂傷,因為CP常說的就是:你看,人家ios的那個效果好炫酷,比如下面這樣的 作為一名合格的碼農,實在不能忍,最後還是實現了這個效
實現方式實現的方式有很多種 這裡總結最常見的幾種方式,以後再添加其他的。viewPager + RadioGroupviewPager + FragmentT
吸引用戶的眼球,是我們至死不渝的追求;第一時間呈現最有價值的信息,簡明大方,告訴客戶,你的選擇是多麼的明智,這正是你尋覓已久的東西。分組的應用場合還是很多的,有數據集合的
Android輸入法框架(Input Method Framework,IMF)是Android中非常重要的模塊,它分布於三個部分(確切的說,是三個進程), 包含編輯框