首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Android开发日常:使用JNI执行任何二进制文件

JNI是 Java Native Interface 的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。从 Java1.1 开始,JNI标准成为java平台的一部分,它允许 Java 代码和其他语言写的代码进行交互 。JNI 一开始是为了本地已编译语言,尤其是 C 和 C++ 而设计的 ,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI 标准至少要保证本地代码能工作在任何 Java 虚拟机环境。

01

“undefined JNI_GetCreatedJavaVM”和“File format not recognized”错误原因分析

如果编译时,报如下所示错误: ../../third-party/hadoop/lib/libhdfs.a(jni_helper.c.o): In function `getGlobalJNIEnv': /root/hadoop-2.4.0-src/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/jni_helper.c:446: undefined reference to `JNI_GetCreatedJavaVMs' /root/hadoop-2.4.0-src/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/jni_helper.c:505: undefined reference to `JNI_CreateJavaVM' /root/hadoop-2.4.0-src/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/jni_helper.c:505: undefined reference to `JNI_CreateJavaVM' 是因为链接时,没有加上库文件libjvm.so。加上libjvm.so重编译,如果又遇到如下所示的错误: ../../third-party/libjvm.so: file not recognized: File format not recognized 这问题是因为libjvm.so不能被识别,libjvm.so的版本过高导致的 nm ../../third-party/libjvm.so | grep JNI_CreateJavaVM nm: ../../third-party/libjvm.so: 不可识别的文件格式 查看nm的版本: nm --version GNU nm 2.16.91.0.5 20051219 (SUSE Linux) Copyright 2005 Free Software Foundation, Inc. 本程序是自由软件;您可以按照 GNU 通用公共许可证 的条款对其进行再发行。本程序没有任何担保。 现在换成高一点的版本试试: ./nm --version GNU nm 2.17.50.0.6-20.el5 20061020 Copyright 2005 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License.  This program has absolutely no warranty. 再次执行,一切正常,需要升级ld了,或者降低JRE或JDK的版本试试: ./nm libjvm.so | grep JNI_CreateJavaVM 00000000006307c0 T JNI_CreateJavaVM

03

Android 进阶解密笔记-Android 系统进程

僵尸进程:在Linux中,父进程使用fork创建子进程,子进程终止后,但父进程不知道子进程终止,虽然子进程已经退出,但系统还未它保留一定的信息(比如进程号,退出状态,运行时间),这时候,子进程就被称为僵尸进程。系统资源有限,如果进程被僵尸进程耗尽,那么就无法创建出新的进程。 Android 提供一种属性服务相当于Windows下的注册表管理器记录用户及软件信息,即使系统或软件重启,根据之前的信息,进行一些初始化操作。 在Linux新内核中:epoll用来替换select,它是Linux为处理大量文件而做的改进的poll,是Linux多路复用I/O接口select/poll的增强版。它能够显著的提高程序在大量并发连接中只有少量活跃情况下的系统CPU利用率。epoll内部用于保存事件的数据类型是红黑树,查找速度快,只有O(logn),select采用数组保存信息查找速度慢只有O(n),只有当少量文件描述符值,epoll与select的效率才会差不多。

01
领券