編輯:關於Android編程
相信越來越多Android程序員需要用到Android ndk開發swig編譯jni接口,因為這設計到底層編程,如果開發的項目是有硬件產品的話,那更要熟悉這方面的編程。我網上也看了很多關於這方面博客。總的來說,都有一定區別。那我介紹也是跟網上有一定的區別,首先說一下編譯環境配置。Android開發編譯環境就不用我多說了吧。我用ndk版本是這個android-ndk-r8d-windows,swig編譯時這個swigwin-3.0.2。如果怕網上找不到這兩個壓縮包,就評論區留下郵箱吧。
1、加載ndk位置,首先說一下這個路徑,一定不能有空格,或者中文。
window----preferences------Android------NDK 如下圖:
二、項目右鍵找到Android tool------add native suppot 按下去,出現下圖:確定
三、現在項目的目錄結構是這樣的。如下圖所示:
四、配置swig路徑。以及輸出目錄。
點擊如下圖上方箭頭所示,出現external tool configurations,點擊這個。如圖
在上圖中左側新建,輸入名稱。然後是swig的路徑,每個人按照自已去弄。
working directory : 這個是一樣 ${project_loc}
arguments:
-c++ -java -package com.example.jnidmeo
-outdir src/com/example/jnidmeo jni/Unix.i
這裡意思是編譯成java存放的目錄,以及需要編譯c++文件的位置,根據自已項目包名填寫。
apply同意,如果你還沒寫好c++,就不要點擊run。寫好要編譯c++,在點擊run。
五、jni目錄下application.mk配置如下,如果沒有這個文件,自已新建一個,寫下配置.
APP_ABI := armeabi
APP_STL := stlport_static
六 Android.mk配置
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniDmeoLib //這個是生成庫的名字
LOCAL_SRC_FILES := Unix_wrap.cxx
include $(BUILD_SHARED_LIBRARY)
這上面意思自已去百度一下,篇幅過長,先不做解釋
七 Unix.i文件配置如下:
%module JniDmeoLib
%include std_string.i
%{
#include
#include
%}
%include
%include
八 此時目錄如下圖:
九 現在就回到那個按鍵點擊 Run 返回剛才你配置那裡Run,出現下圖,不報錯就是那個樣子:
十、最後生成效果,以及目錄找到那個JniDmeoLibJNI.class
打開,寫上加載庫
static{
System.loadLibrary(JniDmeoLib);
}
如下代碼:加粗的地方就是需要寫的,雙引號是你的庫名字。
/* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 3.0.2 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ package com.example.jnidmeo; public class JniDmeoLibJNI { //下面static要自已寫上去,加載生成JniDmeoLib庫.JniDmeoLib是庫名字 static{ System.loadLibrary(JniDmeoLib); } public final static native long new_CTest(); public final static native void delete_CTest(long jarg1); public final static native double CTest_getTest(long jarg1, CTest jarg1_, double jarg2, double jarg3); public final static native long new_CoutputChar(); public final static native void delete_CoutputChar(long jarg1); public final static native String CoutputChar_getfileName(long jarg1, CoutputChar jarg1_); public final static native void CoutputChar_setfileName(long jarg1, CoutputChar jarg1_, String jarg2); }
十一、選中你的項目,再點擊project-----build project,出現圖下:生成so庫,以及存放的路徑
十二、最後目錄時這樣的。
十三、測試代碼
package com.example.jnidmeo; import android.os.Bundle; import android.app.Activity; import android.view.View; import android.widget.TextView; public class MainActivity extends Activity { //使用swig自動編譯出來的jni接口調用c++裡面方法實現的 private CTest mCTest = new CTest(); private CoutputChar mCoutputChar = new CoutputChar(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mCoutputChar.setfileName(strname); } //測試調用c++方法 public void BtTest(View v) { TextView tvShow = (TextView) findViewById(R.id.tv_test); tvShow.setText(CoutputChar獲取值: + String.valueOf(mCoutputChar.getfileName()) + , CTest:計算值 + String.valueOf(mCTest.getTest(1.99, 2.88))); } }
你可以設置為庫,生成jar包,jar包和so文件拿到其它項目去用。
到這裡就結束了,如有不清楚地方請留言。
在Android程序中很多客戶端軟件和浏覽器軟件都喜歡用Tab分頁標簽來搭建界面框架。讀者也許會馬上想到使用TabHost 與 TabActivity的組合,其實最常用的
很多人在開發Android項目時沒有考慮過架構模式的問題,以至於隨著項目的增大,Activty或者Fragment中代碼也會越來越多,導致項目的維護變的越來越復雜。然而在
public class MainFragmentPagerAdapter extends FragmentPagerAdapter implement
上篇博客已經實現了地圖的定位以及結合了方向傳感器用戶路癡定位方向,如果你還不清楚,請查看:Android 百度地圖 SDK v3.0.0 (二) 定位與結合