JNI入门课程-第六章:JNI中读取本地文件
序章:
1.本篇是JNI入门教程的第六篇,完整教程连接如下:
JNI入门课程-序章https://blog.csdn.net/rzleilei/article/details/122084609
2.本篇主要考察的是各种数据类型的转换,要完成的需求如下:
java层传入一个文件的地址,在JNI层读到其中的内容,然后返回给JAVA层展示。
一。流程步骤
本章中执行流程主要包含以下几个步骤:
1.在java中声明引用。
2.创建jni方法,并在cpp文件中进行动态注册。
3.在CMakeLists中进行声明,声明之后jni中的方法才能被java外部调用。这步骤不介绍了,同上一篇。
4.java层中构造各种数据类型,然后传给JNI进行调用。
二。在java中声明引用
这个和上一篇一样,只是增加了一个实现native方法。
public class DynamicRegister {
static {
System.loadLibrary("DynamicRegister");
}
/**
* 拼接字符串str1和str2
* @param str1
* @param str2
* @return
*/
public native String spliceString(String str1,String str2);
/**
* 读取指定路径的文件内容
* @param path
* @return
*/
public native String readStrByPath(String path);
}
三。创建JNI的方法,并动态注册
1.创建JNI中的方法,传入参数path为jstring类型,返回为读取到的内容,jstring类型。
jstring nativeReadStrByPath(JNIEnv *env, jobject object, jstring path) {
const char *str = env->GetStringUTFChars(path, JNI_FALSE);
FILE *file = fopen(str, "r");
LOGI("content%","111");
__android_log_print(ANDROID_LOG_INFO, "lxltestjni", "111");
if (file == NULL) {
LOGI("null2");
}
std::string result;
char buffer[1024] = {0};
while (fread(buffer, sizeof(char), 1024, file) != 0) {
LOGI("%s","content");
result += buffer;
}
return env->NewStringUTF(result.c_str());
}
方法中,首先把jstring转为C中的字符串类型char
然后使用fopen生成文件指针,
然后使用fread不断的读取内容到result中,最终返回result。
2.对刚才创建的方法进行动态注册
static JNINativeMethod method_table[] = {
// 第一个参数a 是java native方法名,
// 第二个参数 是native方法参数,括号里面是传入参的类型,外边的是返回值类型,
// 第三个参数 是c/c++方法参数,括号里面是返回值类型,
{"spliceString", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", (jstring *) nativeSpliceString},
{"readStrByPath", "(Ljava/lang/String;)Ljava/lang/String;", (jstring *) nativeReadStrByPath},
};
四。CMakeLists中做好声明
1.创建文件Cmake文件,同上一章,略。
五。验证效果
因为如果读取SD卡文件的话,还要额外申请权限。所以这里我们简单一点,先创建一个文件,然后写入hello world内容。然后通过JNI去读取。
1.data/file目录下,生成文件,并写入内容
val file = File(filesDir.absolutePath + File.separator + "a.txt")
IOHelper.writerStrByCodeToFile(file, "utf-8", false, "hello world")
2.java中调用JNI方法
if (position == 4) {
val file = File(filesDir.absolutePath + File.separator + "a.txt")
IOHelper.writerStrByCodeToFile(file, "utf-8", false, "hello world")
val readStrByPath = dynamicRegister.readStrByPath(file.absolutePath)
mResult.text = "$readStrByPath"
return
}
3.点击JNI读取文件,查看效果,这时候我们发现result中显示了从文件中读取的内容,如下图:
附:项目地址和源码
android_all_demo/DemoClient at master · aa5279aa/android_all_demo · GitHub
相关文章
- Android布局文件的载入过程分析:Activity.setContentView()源代码分析
- powershell输出错误信息到文件
- Linux修改文件权限
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
- c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对
- [转]ExtJs入门之filefield:文件上传的配置+结合Ajax完美实现文件上传的asp.net示例
- python入门常用方法(转json,模拟浏览器请求头,写入文件)
- python之模块csv之CSV文件的写入(按行写入)
- 《网页设计与前端开发 Dreamweaver+Flash+Photoshop+HTML+CSS+JavaScript 从入门到精通》——2.2 HTML文件的编写方法
- 《HTML CSS JavaScript 网页制作从入门到精通 第3版》—— 1.2 HTML文件的编写方法
- 《HTML CSS JavaScript 网页制作从入门到精通 第3版》—— 1.3 使用浏览器浏览HTML文件
- 《HTML与CSS入门经典(第8版)》——2.3 理解Web服务器上放置文件的位置
- Android入门之文件系统操作(二)文件操作相关指令
- Androlid入门之文件系统操作(三)文件读写
- Android JNI入门第四篇——Android.mk文件分析
- php命令行按模板生成应用的入口文件
- Delphi IdHttp组件+IdHttpServer组件实现文件下载服务
- 《C#零基础入门之百识百例》(九十三)本地数据交互 -- 文件相关类介绍 -- 读写txt文本文件
- 检查程序是否是PE文件
- 本地删除的文件怎么再从svn上下载