




已阅读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-r5sampleshello-jni(根据你具体的安装位置而定),2、运行cygwin,输入命令cd/cygdrive/e/android-ndk-r5/samples/hello-jni,进入到E:android-ndk-r5sampleshello-jni目录。3、输入$NDK/ndk-build,执行成功后,它会自动生成一个libs目录,把编译生成的.so文件放在里面。($NDK是调用我们之前配置好的环境变量,ndk-build是调用ndk的编译程序)4、此时去hello-jni的libs目录下看有没有生成的.so文件,举例,我们首先用java编写helloworld应用程序(APK),这个代码很简单创建一个HelloWorldactivitypublicclassHelloWorldextendsActivityprivatestaticfinalStringTAG=HelloWorld;staticSystem.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_TAGHelloWorld#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(methods0)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)FindClass2、获取类方法:jmethodIDmid=env-GetMethodID3、获取类成员变量:fieldIDfid=env-GetFieldID4、生成类对象:jobjectobj=env-NewObject(jobect也可以从Java层传下来)5、调用类成员方法:env-CallXXXMethod(XXX为Java方法的返回值类型),例子,首先是Java的代码,首先生成一个JniTest类,里面有个sayHelloFromJava的方法,我们要实现的目标是在C+里面赋值(Stringstr),两个整形值(intindex1,intindex2),一个整形数组(intintArray),然后在Java里面将这些数值打印出来。,1.publicclassJniTestextendsActivity2./*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,intintArray)Log.i(TEST,str+ButIamshowinjava);Log.i(TEST,index1=+index1+index2=+index2);intjavaIndex=5;for(inti=0;iFindClass(cc/androidos/jni/JniTest);jmethodIDctor=env-GetMethodID(clz,()V);.jobjectobj=env-NewObject(clz,ctor);jmethodIDmid=env-GetMethodID(clz,sayHelloFromJava,(Ljava/lang/String;III)I);if(mid)LOGI(midisget);jstringstr1=env-NewStringUTF(IamNative);jintindex1=10;jintindex2=12;jintArraytestIntArray=env-NewIntArray(10);jint*test=newjint10;for(int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年体检行业市场格局与服务质量提升策略研究报告
- 药品运输设备管理制度
- 药品风险沟通管理制度
- 药店培训药品管理制度
- 药店药品库存管理制度
- 设备使用科室管理制度
- 设备备件报废管理制度
- 设备异常运营管理制度
- 设备检修分工管理制度
- 设备相机使用管理制度
- 工地试验室安全培训内容
- 医疗设备维保服务项目组织机构及人员配备
- 射频同轴连接器设计理论基础
- 广东省高速公路工程地质勘察技术规程(2024 版)
- 2024年内蒙古自治区包头市公开招聘警务辅助人员(辅警)笔试高频必刷题试卷含答案
- 耳尖放血医学课件
- 公司绿色可持续发展规划报告
- 2024年4月份弱电施工日志
- 【MOOC】设计的力量-湖南大学 中国大学慕课MOOC答案
- IP授权合作框架协议
- 《AIGC与电商营销技能实战(慕课版)》 课件 第9章 AIGC 应用案例
评论
0/150
提交评论