版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JNI面试核心题库及详细参考答案(企业实战版)适用场景:Android开发、移动端跨平台、C/C++与Java混合开发面试题库说明:全部题目为一线企业高频面试原题,覆盖基础概念、调用原理、数据交互、线程问题、常见坑点、性能优化,答案贴合工程实战,无理论空话。一、基础概念面试题(高频必问)1.什么是JNI?它的核心作用是什么?参考答案:JNI全称JavaNativeInterface,是Java提供的本地接口规范。核心作用是实现Java代码与本地C/C++代码的双向交互,让Java可以调用底层原生代码,也支持原生代码反向调用Java层方法。主要应用场景:调用系统底层能力、图像处理、音视频编解码、算法加密、性能优化、复用成熟的C/C++开源库。2.JNI的优缺点分别是什么?参考答案:优点:1.突破Java语言限制,可调用底层系统接口,实现Java无法完成的底层操作;2.C/C++执行效率更高,适合密集型计算、音视频、算法运算场景;3.可以复用大量成熟的跨平台C/C++开源库,减少重复开发;4.核心逻辑放到原生层,能够一定程度上防止代码反编译,提升安全性。缺点:1.增加开发和调试成本,跨语言调用报错排查难度远高于纯Java代码;2.Java具备垃圾回收机制,而原生层需要手动管理内存,极易出现内存泄漏、野指针问题;3.跨平台兼容性差,不同CPU架构需要编译对应so库,适配成本高;4.JNI调用存在开销,频繁跨层调用会影响程序性能。3.JNI、NDK、JNA三者的区别?参考答案:JNI:是一套接口标准、编程规范,是Java与本地代码通信的底层协议,是基础核心。NDK:是Android提供的开发工具集,包含编译工具、头文件、库文件,用来编译C/C++代码为Android可用的so动态库,是基于JNI规范的开发工具。JNA:是对JNI的高层封装,无需手写JNI适配层,可直接调用系统动态库,开发效率高,但性能较差,不适合高频调用场景。4.JNI支持的数据类型有哪些?和Java类型如何对应?参考答案:JNI数据类型分为基本类型和引用类型两大类:基本类型(直接映射,可直接取值):jboolean(boolean)、jbyte(byte)、jchar(char)、jshort(short)、jint(int)、jlong(long)、jfloat(float)、jdouble(double)引用类型(需要通过JNI方法操作,不能直接访问):jobject(所有对象父类)、jstring(字符串)、jarray(数组父类)、jclass(类对象)、jmethodID(方法ID)、jfieldID(字段ID)等。二、调用原理与实操面试题(核心考点)5.Java调用Native方法的完整流程是什么?参考答案:1.Java层声明native修饰的空方法,不实现具体逻辑;2.项目中加载编译好的so动态库,通常使用System.loadLibrary();3.通过javah工具根据Java类生成对应的JNI头文件,生成规范的C/C++方法名;4.在C/C++文件中实现头文件中声明的native方法;5.通过NDK编译脚本配置编译规则,将C/C++代码编译为对应架构的so库;6.Java层直接调用native方法,自动映射执行原生层逻辑。6.Native层如何反向调用Java层的普通方法和静态方法?参考答案:核心流程:获取JNI环境->获取Java类->获取方法ID->调用对应方法。1.静态方法调用:通过FindClass找到类,GetStaticMethodID获取静态方法ID,调用CallStaticXXXMethod执行方法;2.普通成员方法调用:FindClass获取类->NewObject创建对象->GetMethodID获取方法ID->CallXXXMethod执行方法;注意:方法签名必须和Java层严格一致,签名错误会导致找不到方法,调用失败。7.什么是JNI方法签名?作用是什么?常用签名规则?参考答案:JNI方法签名是用来唯一标识Java方法的字符串,因为Java支持方法重载,仅靠方法名无法区分重载方法,必须通过签名区分。基础类型签名:Z=boolean、B=byte、C=char、S=short、I=int、J=long、F=float、D=double、V=void引用类型签名:L+类全路径+;例如String签名:Ljava/lang/String;数组签名:[+类型签名例如int[]签名:[I,String[]签名:[Ljava/lang/String;完整方法签名格式:(参数签名)返回值签名8.JNI中jstring为什么不能直接转换使用?正确转换方式是什么?参考答案:jstring是Java字符串的引用对象,并非C/C++的char*字符串,无法直接取值、打印或运算,直接使用会导致程序崩溃。正确转换流程:1.使用GetStringUTFChars将jstring转为C/C++可操作的constchar*;2.完成业务逻辑处理后,必须调用ReleaseStringUTFChars释放资源,避免内存泄漏;3.如需在原生层返回字符串给Java层,通过NewStringUTF生成jstring对象。三、内存与引用面试题(重难点、面试高频坑点)9.JNI中的局部引用、全局引用、弱全局引用的区别及使用场景?参考答案:1.局部引用(LocalReference)默认创建的jobject、jstring都是局部引用,生命周期仅限当前JNI方法调用周期,方法执行结束后自动释放。不能跨线程、不能跨方法使用,局部引用过多会触发引用表溢出。2.全局引用(GlobalReference)通过NewGlobalRef创建,生命周期手动控制,可跨线程、跨方法使用,适合长期持有Java对象。不会自动释放,使用完毕必须手动DeleteGlobalRef,否则会造成严重内存泄漏。3.弱全局引用(WeakGlobalReference)通过NewWeakGlobalRef创建,同样支持长期持有、跨线程使用,但不会阻止Java垃圾回收。当Java层对象被GC回收后,弱引用会失效,适合不需要强绑定对象的缓存场景。10.JNI常见的内存泄漏场景有哪些?参考答案:1.jstring、数组资源使用后未调用对应Release方法释放;2.全局引用创建后,页面销毁、业务结束未手动删除释放;3.原生层长期持有Java层对象引用,导致对象无法被GC回收;4.频繁创建局部引用不主动释放,累积导致引用表溢出;5.原生层手动malloc、new开辟的内存,异常退出时未释放。11.JNI中Native线程调用Java方法需要注意什么?参考答案:1.Native子线程默认没有挂载JNI环境,无法直接调用Java方法,必须先通过AttachCurrentThread挂载线程,获取JNIEnv;2.线程使用完毕后,必须调用DetachCurrentThread解绑线程,避免线程资源泄漏;3.子线程中不能使用局部引用,如需长期使用对象,必须创建全局引用;4.子线程调用JavaUI相关方法时,需确保切换到Android主线程,否则会触发UI线程异常。四、性能与异常问题(进阶面试题)12.JNI调用为什么会有性能损耗?如何优化?参考答案:损耗原因:1.跨语言调用需要切换虚拟机栈和原生栈,存在上下文切换开销;2.数据在Java堆和Native堆之间需要拷贝转换,产生数据拷贝开销;3.频繁获取class、methodID、fieldID会产生重复查询开销。优化方案:1.减少跨层调用次数,将多次小调用合并为一次批量调用;2.在静态代码块中提前缓存class、方法ID、字段ID,避免重复查找;3.尽量使用直接缓冲区DirectBuffer,减少数据拷贝;4.密集型计算全部下沉到原生层,避免Java层循环频繁调用Native方法。13.JNI中如何处理Java抛出的异常?Native层如何捕获?参考答案:JNI调用Java方法出现异常时,不会直接崩溃,而是会标记异常状态,继续向下执行代码,极易引发后续逻辑错乱。处理方式:通过ExceptionCheck判断是否存在异常,ExceptionDescribe打印异常信息,ExceptionClear清空异常状态,必要时直接return终止当前逻辑,避免异常扩散。14.so库加载失败的常见原因有哪些?参考答案:1.缺少对应CPU架构的so文件,设备架构与编译架构不匹配;2.so文件依赖其他系统库,设备缺少依赖库;3.NDK版本、编译配置与项目环境不兼容;4.64位设备加载32位so或反之,架构冲突;5.打包时未配置ndkabi过滤,导致so未被打入安装包。五、综合实操问答(面试压轴题)15.简述JNI开发中最容易踩的5个坑参考答案:1.字符串、数组资源使用后不释放,引发内存泄漏;2.跨线程使用局部引用,导致程序闪退崩溃;3.方法签名写错、包名类名变更未同步更新,导致找不到方法;4.原生子线程不挂
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《向画家学画故事》表格版教案-2026-2027学年冀美版(新教材)小学美术四年级上册
- 4.3.2高速交叉线岔
- 项目七 Internet应用电子课件
- 活塞式发动机修理工岗位安全竞赛考核试卷含答案
- 煤粉工岗中环保及安全考核试卷含答案
- 起毛挡车工岗中工作规范考核试卷含答案
- 2025年光伏逆变器科普教育创新方案
- 2027版《普通话与职场口才训练》课件 项目四
- 2025年职业健康培训考试试题+答案
- 2025年中储粮湖南分公司招聘(33人)笔试历年参考题库附带答案详解
- 2026年人教版小学数学三年级上册全册教案
- 企业商业秘密保护技术应用调研报告
- 2026-2030中国仲钨酸铵行业供需态势及投资策略分析研究报告
- 《物业设备设施管理(第2版)》-第二章
- 儿童焦虑量表(RCMAS)
- 2026年中国超高性能轮胎市场数据研究及竞争策略分析报告
- 村卫生室安全输液制度
- 货场硬化施工方案(3篇)
- 2025年外军管理概论题库及答案
- 手术安全核查制度课件
- 2026届黑龙江绥化一中数学高二上期末调研模拟试题含解析
评论
0/150
提交评论