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调用大概流程图如下:
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);
}