歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android+JNI調用–文件操作(附源碼)

開發環境: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);
}

Copyright © Linux教程網 All Rights Reserved