android ndk 界面开发教程,Android NDK开发之入门教程
JNI(Java Native Interface, Java本地化方法)使得Java能與其它語言(如C、C++)的動態庫進行交互。
在Android 項目中,經常看到地圖,統計,推送之類的第三方平臺都用了 JNI。
Android NDK(Android Native Development Kit)是一系列的開發工具,使用JNI編程,可以提高程序的執行效率,更方便地使用現存的開源庫。
至于配置NDK環境,無論是Cygwin還是最新的(無Cygwin),網上的教程太多了,這里不再贅述。
好了,下面開始寫一個入門Demo了……
首先新建一個Android project
項目右鍵點擊-Android Tools -Add Native Support
點擊Finish。
可以看到在Android項目中生成了一個JNI文件:
然后在MainActivity 中添加以下代碼:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initJNI();
}
private void initJNI() {
TextView tv = new TextView(this);
tv.setTextSize(25);
tv.setBackgroundColor(Color.parseColor("#FFA07A"));
tv.setText(myTestNdk());
tv.setGravity(Gravity.CENTER);
setContentView(tv);
}
public native String myTestNdk();
static {
System.loadLibrary("TestBaseJNI");
}
}
System.loadLibrary("TestBaseJNI")表示VM去加載動態庫TestBaseJNI.so文件;
public native String myTestNdk(),這里的native表示這個方法由本地代碼定義,需要通過jni接口調用本地c/c++代碼,在java代碼中僅僅是聲明。
然后在TestBaseJNI.cpp添加以下代碼:
#include
#include
extern "C" {
jstring Java_com_example_testbase_MainActivity_myTestNdk(JNIEnv* env,
jobject thiz) {
return env->NewStringUTF("Hello NDK");
}
}
聲明加extern "C",是解決C++函數名問題;
"Java_com_example_testbase_MainActivity_myTestNdk",嚴格按照這種格式寫。開頭是Java,后面依次是包名,Activity名,方法名;
jstring表示返回類型,這段函數的功能就是返回字符串"Hello NDK"。
這時候可能會報錯。
Type 'jstring' could not be resolved
Method 'NewStringUTF' could not be resolved等等。
遇到這些類錯誤:
Type 'XXX' could not be resolved
Method ?'XXX' ' could not be resolved
常見的解決辦法:
右鍵->Properties,點擊C/C++ General展開,點擊Path and Symbols, 右側Includes,點擊Add,把NDK文件夾下的jni頭文件和相應的C++頭文件添加進來
這是我添加的兩個路徑:
F:\Installer\Programming\android-ndk32-r10b-windows-x86\android-ndk-r10b\toolchains\mipsel-linux-android-4.8\prebuilt\windows\lib\gcc\mipsel-linux-android\4.8\include
F:\Installer\Programming\android-ndk32-r10b-windows-x86\android-ndk-r10b\platforms\android-19\arch-arm\usr\include
運行成功界面:
好了,我們再通過手動建JNI的方式來實現上面的Demo
首先新建一個Android project
根目錄建立JNI文件夾,再分別創建Android.mk和hello-jni.c文件
在MainActivity 中添加以下代碼:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView myTextView = new TextView(this);
myTextView.setText(stringTestNdk());
setContentView(myTextView);
}
public native String stringTestNdk();
static {
System.loadLibrary("hello-jni");
}
}
在
hello-jni.c中添加:
#include
#include
/* This is a trivial JNI example where we use a native method
* to return a new VM String. See the corresponding Java source
* file located at:
*
* apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
*/
jstring Java_com_example_testndk_MainActivity_stringTestNdk(JNIEnv* env,
jobject thiz) {
return (*env)->NewStringUTF(env, "Hello Test NDK !");
//return env->NewStringUTF("Hello NDK");
}
在
Android.mk配置中添加:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE表示編譯的動態庫名稱
LOCAL_SRC_FILES 表示源代碼文件
建立并配置Builder:
右鍵-屬性-Builder-New-Main,Refresh,Build中如下配置(按照實際項目操作,這里只是舉例),編譯并生成.so文件。
然后可以看到在在控制臺輸出信息(如果沒有,Project-Clean):
[armeabi] Compile thumb ?: hello-jni <= hello-jni.c
[armeabi] SharedLibrary ?: libhello-jni.so
[armeabi] Install ? ? ? ?: libhello-jni.so => libs/armeabi/libhello-jni.so
在libs-armeabi下生成了libhello-jni.so文件
運行成功截圖:
代碼就這么幾行,注意操作步驟就OK了,Demo就不上傳了……
總結
以上是生活随笔為你收集整理的android ndk 界面开发教程,Android NDK开发之入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML图片瓦片,HTML5 可扩展瓦片
- 下一篇: 查询高考成绩2021一分一段表,一分一段