在Android 系统中直接调用 SO 文件
更新时间:2023-05-17 10:32:01 阅读量: 实用文档 文档下载
在Android系统中直接调用SO文件
文/图 mangel
Android虚拟机不能直接调用底层设备,如果要对底层设备进行调用,就需要用到so使用C语言或C++编写完成,利用NDK进行编译,直接运行在Linux内核中,按jni调用so时,基本类型可以直接交互。
在apk里打包进.so文件的方法有两种,一 是在Android.mk文件里增加
“LOCAL_JNI_SHARED_LIBRARIES := libxxx”,这样在编译的时候,NDK自动会把这个libxxx打包进apk,放在xxx/lib/目录下;二是在应用的目录下手工建libs/armeabi目录,然后把libxxx.so拷贝到这个目录下,NDK也会自动把这个libxxx.so打包进apk,位置还是在xxx/lib/目录下。 在代码里,使用System.loadLibrary("xxx");就可以加载这个动态库了。这里要注意,参数只写xxx就可以了,不需要写libxxx,也不需要写libxxx.so。
还有一点要说明,System.loadLibrary这个函数会在如下路径搜索libxxx.so文件: /system/lib
/data/data/xxx apk package/lib
如果libxxx.so还依赖其它.so文件,比如libyyy.so,则System.loadLibrary只会在/system/lib目录下查找,如果没找到,不会自动到/data/data/xxx apk package/lib下去找,这个时候就会报动态库没找到的错误。解决方法是在load libxxx.so之前,先load libyyy.so,具体如下: System.loadLibrary("yyy");
System.loadLibrary("xxx");
本文结合使用实例进行说明。 创建jni目录.libs目录
在工程根目录下创建jni目录,libs目录不用手动建立,如图1所示。注意,这里使用的是ndk_R7,所以不需要用jdk去生成C文件。
图1
Java编写接口文件(Device.java)
Device.java的代码实现如下:
public class Device {
static {
System.loadLibrary("device");
}
public native String deviceTestString(String test);
}
方法名必须使用native关键字声明,并且必须使用system.loadLibrary("SO文件名")承载C类库。
编写C文件(devices.c)
这里编写的C代码属于Linux C范畴,实现代码如下:
#include <string.h>
#include <jni.h>
char* jstringTostrM(JNIEnv* env, jstring jstr)
{
char* pStr = NULL;
jclass jstrObj = (*env)->FindClass(env, "java/lang/String");
jstring encode = (*env)->NewStringUTF(env, "utf-8");
jmethodID methodId = (*env)->GetMethodID(env, jstrObj, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray byteArray = (jbyteArray)(*env)->CallObjectMethod(env, jstr, methodId, encode);
jsize strLen = (*env)->GetArrayLength(env, byteArray);
jbyte *jBuf = (*env)->GetByteArrayElements(env, byteArray, JNI_FALSE); if (jBuf > 0)
{
pStr = (char*)malloc(strLen + 1);
if (!pStr)
{
return NULL;
}
memcpy(pStr, jBuf, strLen);
pStr[strLen] = 0;
}
(*env)->ReleaseByteArrayElements(env, byteArray, jBuf, 0);
return pStr;
}
jstring Java_com_jack_Device_deviceTestString(JNIEnv* env,jclass clazz,jstring path){
//system("echo devices.so test > /sdcard/log/log.txt");
char * test = jstringTostrM(env,path);
return (*env)->NewStringUTF(env, test);
}
注意C的函数命名规则,Java的jni标准必须有,com_jack_Device是Device.java文件的全名,再下来才是C函数名,jstringTostrM函数必须写在Java_com_jack_Device_deviceTestString函数前,如果不是,必须要在C文件头进行声明,声明代码为:
char* jstringTostrM(JNIEnv* env, jstring jstr);
编写Android.mk和编译android.mk
Android.mk的代码如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := device
LOCAL_SRC_FILES := device.c
include $(BUILD_SHARED_LIBRARY)
如果要编译成可执行文件,还需包含代码include $(BUILD_EXECUTABLE),之后按照图2所示编译即可。
图2
编写Java代码进行C函数调用
Device device = new Device();
String test = device.deviceTestString("你好~!!!");
Toast toast = Toast.makeText(Jack_ndk_jstringActivity.this, test, Toast.LENGTH_LONG); toast.setGravity(Gravity.TOP,0,150);
toast.show();
TextView text = (TextView) findViewById(R.id.text1);
text.setText(test);
注意,最后在AndroidManifest.xml文件中要加入文件控制权限,代码如下:
<!-- 文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
正在阅读:
人教版九年级化学上册《金刚石、石墨和C60》第一课时教学设计12-28
班级风波作文400字06-28
当今世界政治发展的特点04-03
学校班主任的工作随笔11-20
地震应急疏散演练记录206-10
雷美替胺的市场分析(新)05-15
银行会计风险防范思路探究10-14
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 调用
- 直接
- Android
- 文件
- 系统
- SO
- DSGE模型的结构和应用
- 玉林市田家炳中学2021届高三上学期教学质量检测数学(文)试卷
- 2012-2013学年新人教版高一语文必修二能力拓展12)
- 机电传动控制考试重点总结
- 2013外研版英语七年级下7-8模块期末复习
- 防火防爆考试复习题
- 中华全国律师协会律师办理拆迁法律业务操作指引
- 干部教育培训工作条例(试行)知识问答
- 金蝶EASV5.1集团战略人力资源管理解决方案(完整版).doc
- VirtuoZo七步教学手册
- 异形坯(工字型坯)连铸技术:——马钢方坯/异形坯连铸机
- 第二章 单片机结构和时序
- 新人教版一年级下册数学__20以内的退位减法___例6_解决比多比少的问题
- 急诊科护理质量控制与安全管理会议记1
- 2010年9月14日审核完成李正等10名办理注销注册监理工程师
- 造价工程师《造价管理》历年真题精选及详细解析0905-11
- 高温耐磨防腐涂料
- 基于科技创新人才信息平台数据挖掘的科研能力评价模型研究
- 人教版数学必修四:3.1.2两角和与差的正弦(一)学案(教师版)
- 2015年1月20日国内外时事新闻