




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Androidjava层与linux底层相互调用 Android与linux底层程序互调用 Android调用底层程序java程序如何访问windows linux底层c c的程序 JNI JavaNativeInterfaceJNI标准是java平台的一部分 它允许Java代码和其他语言写的代码进行交互 JNI是本地编程接口 它使得在Java虚拟机 VM 内部运行的Java代码能够与用其它编程语言 如C C 和汇编语言 编写的应用程序和库进行交互操作 JNI工作机制 JAVA VM Linux组件 C C Java类编译为Dex型式的Bytecode之后必须靠Dalvik虚拟机来执行 JNI开发环境 ndk 推荐 Android提供了windows和linux下的JNI开发环境ndk NativeDevelopmentKit交叉编译器编译的代码符合arm linux提供了用于编译的android基本sdk库提供了bash方式的编译命令 使用非常简单Linux下ndk配置linux下直接下载并解压ndk开发包即可 Ndk windows开发环境 Ndk是在linux下运行的程序 在windows上需要模拟一个linux环境才能执行ndk 怎么模拟 cygwinWindows配置ndk步骤 1 下载windows版本的ndk 2 安装cygwin 并被指ndk环境3 每次编写好程序代码后 启动cygwin 然后执行ndk编译命令编译 JNI开发步骤 1 采用标准c或c 语言编写程序2 类似于linux在makefile android的jni编译需要 mk文件编译 采用命令ndk bulid 例子 1 我们选择ndk自带的例子hello jni 我的位于E android ndk r5 samples hello jni 根据你具体的安装位置而定 2 运行cygwin 输入命令cd cygdrive e android ndk r5 samples hello jni 进入到E android ndk r5 samples hello jni目录 3 输入 NDK ndk build 执行成功后 它会自动生成一个libs目录 把编译生成的 so文件放在里面 NDK是调用我们之前配置好的环境变量 ndk build是调用ndk的编译程序 4 此时去hello jni的libs目录下看有没有生成的 so文件 举例 我们首先用java编写helloworld应用程序 APK 这个代码很简单创建一个HelloWorldactivitypublicclassHelloWorldextendsActivity privatestaticfinalStringTAG HelloWorld static System loadLibrary helloworld privatenativeStringprintJNI Calledwhentheactivityisfirstcreated OverridepublicvoidonCreate BundlesavedInstanceState super onCreate savedInstanceState setContentView R layout main Log d TAG ActivitycallJNI printJNI C语言实现helloworld共享库 使用javah工具 可以根据java源程序 生成Native代码的头文件javahcom simon HelloWorld注意 该命令必须在bin classes下执行执行后得到 一个头文件com simon Helloworld h 这里包含有printJNI接口的C C 声明 创建com simon Helloworld c文件 include defineLOG TAG HelloWorld include Nativeinterface itwillbecallinjavacode JNIEXPORTjstringJNICALLJava com simon HelloWorld printJNI JNIEnv env jobjectobj LOGI HelloWorldFromlibhelloworld so return env NewStringUTF env HelloWorld Thisfunctionwillbecallwhenthelibraryfirstbeload Youcandosomeinitinthelibray returnwhichversionjniitsupport jintJNI OnLoad JavaVM vm void reserved void venv LOGI JNI OnLoad if vm GetEnv vm void 编写Android mk LOCAL PATH callmy dir include CLEAR VARS LOCAL SRC FILES com simon Helloworld cLOCAL C INCLUDES JNI H INCLUDE LOCAL MODULE libhelloworldLOCAL SHARED LIBRARIES libutilsLOCAL PRELINK MODULE include BUILD SHARED LIBRARY 1 LOCAL C INCLUDES说明包含的头文件 这里需要包含JNI的头文件 2 LOCAL MODULE当前模块的名称3 LOCAL SHARED LIBRARIES当前模块需要依赖的共享库 因为在hellowold中我们调用Android打印系统输出到logger 所以我们必须要依赖libutils库 4 LOCAL PRELINK MODULE指明该模块是否被启动就加载 我们的helloworld库不需要prelink 所以置为false JNIAPI为了避免丑陋的函数名 提供了方法向Java虚拟机注册函数映射表 这样当Java调用Native接口的时候 Java虚拟机就可以不用根据函数名来决定调用哪个函数了 直接通过查询表格就可以找到需要调用的函数了 Thisfunctionwillbecallwhenthelibraryfirstbeloaded jintJNI OnLoad JavaVM vm void reserved UnionJNIEnvToVoiduenv JNIEnv env NULL LOGI JNI OnLoad if vm GetEnv void Registernativemethodsforallclassesweknowabout returnsJNI TRUEonsuccess staticintregisterNatives JNIEnv env if registerNativeMethods env classPathName methods sizeof methods sizeof methods 0 returnJNI FALSE returnJNI TRUE Registerseveralnativemethodsforoneclass staticintregisterNativeMethods JNIEnv env constchar className JNINativeMethod gMethods intnumMethods jclassclazz clazz env FindClass className if clazz NULL LOGE Nativeregistrationunabletofindclass s className returnJNI FALSE if env RegisterNatives clazz gMethods numMethods 0 LOGE RegisterNativesfailedfor s className returnJNI FALSE returnJNI TRUE staticconstchar classPathName com simon HelloWorld staticJNINativeMethodmethods printJNI Ljava lang String void Java com simon HelloWorld printJNI 了解知识 也可以不用ndk进行编译直接用armeabilinux编译器在linux下编译 so文件 如何实现 Jni的非简单类型参数如何传递Android mk文件的编写规范 Linux库回调java步骤 1 获取类名 jclasscls env FindClass2 获取类方法 jmethodIDmid env GetMethodID3 获取类成员变量 fieldIDfid env GetFieldID4 生成类对象 jobjectobj env NewObject jobect也可以从Java层传下来 5 调用类成员方法 env CallXXXMethod XXX为Java方法的返回值类型 例子 首先是Java的代码 首先生成一个JniTest类 里面有个sayHelloFromJava的方法 我们要实现的目标是在C 里面赋值 Stringstr 两个整形值 intindex1 intindex2 一个整形数组 int intArray 然后在Java里面将这些数值打印出来 1 publicclassJniTestextendsActivity 2 Calledwhentheactivityisfirstcreated 3 Override4 publicvoidonCreate BundlesavedInstanceState 5 super onCreate savedInstanceState 6 setContentView R layout main 7 JNIj newJNI 8 j write 9 10 11 publicJniTest 12 13 Log i TEST JniTestConstructor 14 publicintsayHelloFromJava Stringstr intindex1 intindex2 int intArray Log i TEST str ButIamshowinjava Log i TEST index1 index1 index2 index2 intjavaIndex 5 for inti 0 i intArray length i Log i TEST intArray i intArray i returnjavaIndex Jni类 1 publicclassJNI 2 static3 4 System loadLibrary myjni 5 6 publicnativevoidwrite 7 C 里面的代码 JNIEXPORTvoidJNICALLJava cc androidos jni JNI write JNIEnv env jobjectj LOGI calltest jstringstr NULL jclassclz env FindClass cc androidos jni JniTest jmethodIDctor env GetMethodID clz V jobjectobj env NewObject clz ctor jmethodIDmid env GetMethodID clz sayHelloFromJava Ljava lang String II I I if mid LOGI midisget jstringstr1 env NewStringUTF IamNative jintindex1 10 jintindex2 12 jintArraytestIntArray env NewIntA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商业照明设计与安装合同协议条款
- 江西省鹰潭市第九中学2024-2025学年九年级下学期期末考试历史试卷(含答案)
- 幸福除夕夜作文250字13篇范文
- 写人作文我的同学550字13篇
- 《新编商务应用文写作》第七章 习题参考答案
- 春节出游作文800字10篇
- 早教知识培训课件
- 我的奇思妙想作文450字11篇范文
- 产品质量检查与改善方案标准操作模板
- 早搏的鉴别诊断
- 中医药法宣讲余课件
- (完整)动画运动规律动物ppt
- 富士康科技集团劳保用品采购
- 2022年家用空调安装合同范本
- 二手车鉴定评估的报告书
- 教学课件 金属学与热处理-崔忠圻
- 多智能体系统教材课件汇总完整版ppt全套课件最全教学教程整本书电子教案全书教案课件合集
- 艺术欣赏完整版课件全套ppt教程(最新)
- 有限空间作业考试题库600题含答案
- 建筑工程钢筋抽料知识总结
- 铁路变更设计管理办法实施细则(完整版)
评论
0/150
提交评论