編輯:關於Android編程
首先建立一個名為AndroidJniTest的Android工程,包名默認為com.example.androidjnitest,src目錄下自動創建MainActivity.java。
創建新的文件包com.example.jni,並在改包下新建一個TestJNI.java的類。
打開TestJNI.java,我們將在這個文件裡創建一個JNI接口類,該Java類提供一個加法運算的接口:
public class TestJNI { public native boolean init(); public native int add(int x , int y); public native void destory(); }
將TestJNI.java文件復制到工程的bin目錄下,在終端中進入該工程的bin目錄,輸入javac TestJNI.java,這時會生成一個TestJNI.class文件。
在bin文件夾下,如果沒有則創建目錄:/com/example/jni,並把TestJNI.class復制到/bin/com/example/jni目錄下。然後在終端裡進入工程的bin目錄,輸入javah -jni com.example.jni.TestJNI,此時會生成一個com_example_jni_TestJNI.h文件。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+IDxpbWcgc3JjPQ=="/uploadfile/Collfiles/20150212/2015021208583683.png" alt="\">
com_example_jni_TestJNI.h文件就是對應於上面定義的Java接口的C/C++頭文件。打開這個文件,可以看到系統已經為我們自動完成了接口函數的聲明:
這三個函數分別對應於JNI的三個接口函數,命名方式只是在前面加上了Java包名。
有了JNI的C/C++頭文件,就可以在C層實現JNI接口了。首先在工程目錄下創建一個jni目錄,這個目錄就是專門用來放C/C++代碼的。把com_example_jni_TestJNI.h文件復制到jni目錄下,並在這裡創建一個com_example_jni_TestJNI.cpp文件。
由於我想用C++來實現JNI,所以上面兩個文件我只是用來作為動態鏈接庫的接口,具體的實現我希望放在一個類裡面來完成,因此我再添加兩個文件:Add.h和Add.cpp。
下面我們就來實現CAdd類和JNI接口。首先實現CAdd類:
CAdd.h
#ifndef JNI_TEST_ADD #define JNI_TEST_ADD class CAdd{ public: CAdd(); ~CAdd(); int add(int x, int y); }; #endif
#include "Add.h" CAdd::CAdd(){ } CAdd::~CAdd(){ } int CAdd::add(int x, int y){ return x+y; }
然後我們來寫com_example_jni_TestJNI.cpp,實現JNI:
#include#include #include "Add.h" CAdd *pCAdd = NULL; JNIEXPORT jboolean JNICALL Java_com_example_jni_TestJNI_init (JNIEnv *env, jobject obj){ if(pCAdd==NULL){ pCAdd = new CAdd ; } return pCAdd!=NULL; } JNIEXPORT jint JNICALL Java_com_example_jni_TestJNI_add (JNIEnv *env, jobject obj, jint x, jint y){ jint res = -1; if(pCAdd!=NULL){ res = pCAdd->add(x,y); } return res; } JNIEXPORT void JNICALL Java_com_example_jni_TestJNI_destory (JNIEnv * env, jobject obj){ if(pCAdd!=NULL){ delete pCAdd; pCAdd=NULL; } }
JNI實現了之後就要把C/C++代碼編譯成動態鏈接庫.so文件,這樣Java程序才能調用JNI的接口。要編譯so文件,需要寫Android.mk和Application.mk兩個文件。我們先來寫Android.mk。
先在工程目錄的jni下創建一個Android.mk文件:
然後打開文件在裡面輸入如下內容:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := TestJNI LOCAL_SRC_FILES := com_example_jni_TestJNI.cpp LOCAL_SRC_FILES += Add.cpp include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE是要編譯的庫的名稱。編譯器會自動在前面加上lib,在後面加上.so。
LOCAL_SRC_FILES是要編譯的C/C++文件。
現在我們在工程的根目錄下創建一個Application.mk文件,並輸入如下內容:
APP_PROJECT_PATH := ${call my-dir} APP_MODULES := TestJNI
寫完了mk文件就可以開始編譯C/C++代碼了。
默認在Windows7下配置好了NDK開發環境,打開cygwin,進入到工程目錄。
在終端裡進入工程的根目錄,輸入命令“$NDK/ndk-build”命令即可編譯
編譯成功後會在工程目錄的libs/armeabi目錄下生成一個libTestJNI.so文件。
現在我們的Android應用可以調用JNI計算加法的代碼,如下:
static { System.load("TestJNI"); } TextView tvX = null; TextView tvY = null; TextView tvSum = null; Button btnAdd = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvX = (TextView)findViewById(R.id.et_x); tvY = (TextView)findViewById(R.id.et_y); tvSum = (TextView)findViewById(R.id.et_sum); btnAdd = (Button)findViewById(R.id.btn_add); btnAdd.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { int x = Integer.valueOf( tvX.getText().toString()); int y = Integer.valueOf( tvY.getText().toString()); int sum = 0; TestJNI jni = new TestJNI(); boolean flag = jni.init(); if(flag){ sum = jni.add(x, y); } btnAdd.setText(String.valueOf(sum)); } }); }
程序運行結果:
說到老照片,很多人就會想起兒時的照片。沒錯,老照片就是這樣的,我稱之為情懷濾鏡。先說一下Android圖像矩陣處理(圖片來源 慕課網)也就是說,每一個矩陣都對應著一個唯一
Android 自定義陰影效果詳解及實例Android5.X中,Google為其增加了兩個屬性 android:elevation=” ” 與 android:trans
1 背景不能只分析源碼呀,分析的同時也要整理歸納基礎知識,剛好有人微博私信讓全面說說Android的動畫,所以今天來一發Android應用的各種Animation大集合。
經常玩兒App的小伙伴都知道,APP上面有很多按鈕都是圓角的,圓形給人感覺飽滿,富有張力,不知道設計圓角按鈕的小伙伴是不是和小編有著相同的想法`(*∩_∩