開發環境:Windows xp sp3 +MyEclipse 8.6+Android2.3.3+jdk1.6+android-ndk-r6b
JNI概述:
JNI 是 Java Native Interface 的縮寫,譯為 Java 本地接口。它允許 Java 代碼和其他語言編寫的代碼進行交互。在android 中提供 JNI 的方式,讓 Java 程序可以調用 C/C++語言程序。 android 中很多 Java 類都具有 native 接口,這些接口由本地實現,然後注冊到系統中。在android系統中實現JNI庫需要連接.so共享庫,如:lib<文件名>.so。
注意權限
Android NDK概述:
Android NDK是一個工具集,讓你的Android應用程序裡可以內嵌使用本地代碼(C/C++)的組件。
Android應用程序運行在Dalvik虛擬機中。NDK可以讓你使用C/C++這樣的本地代碼語言來實現你的應用程序中某些部分。這對某類程序是有幫助的,比如需要重用已有的C代碼,或者為了提高運行速度。
Android+JNI調用–文件操作完整源代碼下載:
下載在Linux公社的1號FTP服務器裡,下載地址:
FTP地址:ftp://www.linuxidc.com
用戶名:www.linuxidc.com
密碼:www.muu.cc
在 2011年LinuxIDC.com\10月\10月\Android+JNI調用–文件操作源碼
下載方法見 http://www.linuxidc.net/thread-1187-1-1.html
NDK 提供:
1). 編譯文件和工具集,用來將你的C/C++源文件編譯成本地庫。
2). 提供一種方式,將對應的本地庫內嵌到應用程序包文件(.apk)中,最終發布到Android設備中。
3). 本地系統頭文件和庫,這些頭文件和庫從Android1.5開始往後都是被支持的。但使用本地活動(native activity)的程序只能運行在Android 2.3或更高的系統中。
4). 文檔、示例、指南。
本例中JNI調用大概流程圖如下:
1. 編寫Android JNI模塊java調用類
Android虛擬機允許你的應用程序源代碼通過JNI調用實現本地代碼的方法,需要在應用程序中使用關鍵字native聲明一個或多個方法表明該方法是通過本地調用實現的,如:
public native static int FileOpen(StringpFileName,int openMode);
public native static int FileLength(int fp);
public native static int FileSeek(int fp,int offset,int origin);
public native static CusBuffer FileRead(int fp,int nCount);
public native static int FileWrite(int fp,byte[] buf,int nCount);
public native static int FileClose(int fp);
除了聲明native方法以外還必須為這些方法實現提供本地共享庫,該共享庫最終會被打包到.apk文件中,這些共享庫需要更具標准的unix公約來命名lib<文件名>.so,如:libJNI_FileSys.so,其中JNI_FileSys使我們需要加載的庫名。在應用程序中加載共享庫的方法為:
static
{
System.loadLibrary("JNI_FileSys");
}
注:這裡使用的文件名不需要lib前綴以及.so後綴名。
FileSys.java完整代碼實現
package com.luoxudong.jni.reader;
import com.luoxudong.jni.bean.CusBuffer;
/********************************************************************
* [Summary]
* TODO 文件操作類
* [Remarks]
* TODO 請在此處詳細描述類的功能、調用方法、注意事項、以及與其它類的關系.
********************************************************************/
public class FileSys {
static
{
System.loadLibrary("JNI_FileSys");
}
/**
*
* [Summary]
* MjFileOpen 打開文件
* @param strFileName 文件名
* @param openMode 打開類型
* @return 結果
*
*/
public int MjFileOpen(String strFileName,int openMode){
return FileOpen(strFileName, openMode);
}
/**
*
* [Summary]
* MjFileLength 計算文件長度
* @param fp 文件句柄
* @return 文件長度
*
*/
public int MjFileLength(int fp){
return FileLength(fp);
}
/**
*
* [Summary]
* MjFileSeek 文件seek操作
* @param fp 文件句柄
* @param offset 讀取數據偏移量
* @param origin 開始位置指針
* @return
*
*/
public int MjFileSeek(int fp,int offset,int origin){
return FileSeek(fp, offset, origin);
}
/**
*
* [Summary]
* MjFileRead 讀取文件數據
* @param fp 文件句柄
* @param nCount 讀取字節數
* @return 實際讀取字節數
*
*/
public CusBuffer MjFileRead(int fp,int nCount){
return FileRead(fp, nCount);
}
/**
*
* [Summary]
* MjFileWrite 寫文件
* @param fp 文件句柄
* @param buf 寫數據buffer
* @param nCount 需要寫入的字節數
* @return 實際寫入字節數
*
*/
public int MjFileWrite(int fp,byte[] buf,int nCount){
return FileWrite(fp, buf, nCount);
}
/**
*
* [Summary]
* MjFileClose 關閉文件
* @param fp 文件句柄
* @return 關閉文件狀態
*
*/
public int MjFileClose(int fp){
return FileClose(fp);
}
//本地調用
public native static int FileOpen(String pFileName,int openMode);
public native static int FileLength(int fp);
public native static int FileSeek(int fp,int offset,int origin);
public native static CusBuffer FileRead(int fp,int nCount);
public native static int FileWrite(int fp,byte[] buf,int nCount);
public native static int FileClose(int fp);
}