編輯:關於Android編程
開始學習NDK開發,首先以輸出Hello World實例開始講解。
NDK的開發步驟:
1、在Java文件中聲明native方法
public class TestActivity extends Activity { static { System.loadLibrary("my-ndk"); } // 聲明JNI層的原生方法,使用native關鍵字 public native String stringFromJNI(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tvText = new TextView(this); tvText.setText(stringFromJNI()); setContentView(tvText); } }
2、編譯Java文件
直接用javac命令編譯聲明native方法的Java文件
shamoo的工程目錄在E:\project\test
在cmd中,輸入cd E:\project\test
javac src\com\shamoo\jni\HelloJni.java -d bin\classes
-d指定.class文件的輸出目錄
也可以使用eclipse直接生成,生成的目錄在工程目錄的bin\classes
3、使用javah命令生成頭文件
關於javah命令,Shamoo也折騰了一段時間,一直使用命令失敗,總是提示不能訪問Android sdk的類,後來用-classpath指定src的位置就可以了,具體原因不明...
javah -classpath src -d jni -jni com.shamoo.activity.TestActivity
如果聲明native方法的類中沒有使用Android sdk的類就可以使用以下命令,例如HelloJni聲明了navtive方法
javah -classpath bin/classes -d jni -jni com.shamoo.jni.HelloJni
-classpath指定.class文件的根目錄 -d指定輸出目錄 -jni指定聲明了native方法的類。javah是根據.class文件反編譯生成頭文件的
生成的頭文件如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include/* Header for class com_shamoo_activity_TestActivity */ #ifndef _Included_com_shamoo_activity_TestActivity #define _Included_com_shamoo_activity_TestActivity #ifdef __cplusplus extern "C" { #endif /* * Class: com_shamoo_activity_TestActivity * Method: stringFromJNI * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_shamoo_activity_TestActivity_stringFromJNI (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
從頭文件可以看出,原生方法必須指定Java + 原生方法的包名(點用下劃線代替) + 方法名
4、編寫頭文件對應的源文件 com_shamoo_activty_TestActivity.cpp
#include是不是很熟悉,printf("Hello World");不過printf默認不會輸出到Log裡面,需要設置一下才可以。這次編寫源文件就不需要再寫extern "C"標志,因為自動生成的頭文件已經幫我們完成啦!#include #include JNIEXPORT jstring JNICALL Java_com_shamoo_activity_TestActivity_stringFromJNI (JNIEnv *env, jobject) { printf("Hello World"); return env->NewStringUTF("Hello World"); }
5、修改Android.mk文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := my-ndk LOCAL_SRC_FILES := my-ndk.cpp com_shamoo_activity_TestActivity.cpp LOCAL_LALIBS += -llog include $(BUILD_SHARED_LIBRARY)
Android.mk其實就是Makefile,分析一下上面的幾個環境變量
LOCAL_PATH指定源碼的目錄,$(call my-dir),學過Linux Shell再熟悉不過了
LOCAL_MODULE編譯生成的.so庫
LOCAL_SRC_FILES指定加入編譯的源文件
LOCAL_LALIBS指定其他庫,-l + 庫名,例如上述要使用到NDK的LOG就要使用log庫
include導入一些Makefile的片段,比如導入CLEAR_VARS會在配置之前清除以前的環境變量,以免編譯的時候受到其他環境變量的影響,BUILD_SHARED_LIBRARY是導入其他的共享庫
好的直接編譯,執行,沒問題就會看到一個Activity顯示Hello World的文本啦!
我看到越來越多的應用使用這樣的效果,如QQ空間5.0的主界面,確實很好看!大概就搜了一下相關的實現方式,發現早就有了相關的方案: 仿QQ空間滾動ActionBar透明度變
項目地址:https://github.com/JeasonWong/JikeGallery話不多說,先上效果。這個效果是在即刻app上看到,覺得很不錯,遂仿之。先說下我
ListView是安卓中非常常用的一個控件。安卓設計使用Adapter來對ListView進行管理。但是系統提供的Adapter無法滿足一些復雜的顯示情況,這個時候我們就
我們知道,Android的程序打包後會生成一個APK文件,這個文件可以直接安裝到任何Android手機上,因此,反編譯就是對這個APK進行反編譯。Android的反編譯分