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调用–文件操作完整源代码下载:

下载在安科网的1号FTP服务器里,下载地址:

密码:www.muu.cc

下载方法见 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调用大概流程图如下:

Android+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);
}

相关推荐