Android系统JNI的实现方式
Android系统JNI的实现方式
All rights reserved
JNI(Java Native Interface)定义了一种Java代码调用C或者C++代码等其它代码的方式。
在Android系统中,JNI通过JNINativeMethod结构体进行描写叙述,该结构体定义于jni.h,例如以下所看到的:
typedef struct {
const char* name;
const char* signature;
void* fnPtr;
} JNINativeMethod;
第一个參数name:是Java代码中的函数名。
第二个參数signature:用于描写叙述函数的參数和返回值。
第三个參数fnPtr:C代码中函数的指针。
当中,第二个參数为一个描写叙述函数參数和返回值的字符串,字符串的格式例如以下:
(XX..)X
X的取值和定义例如以下所看到的:
字符 |
Java类型 |
C类型 |
V |
void |
void |
Z |
jboolean |
unsigned char |
B |
jbyte |
signed char |
C |
jchar |
unsigned short |
S |
jshort |
short |
I |
jint |
int |
J |
jlong |
long |
F |
jfloat |
float |
D |
jdouble |
double |
另外,从jni.h中对于变量类型的定义中也能够看到这些字符的意义,例如以下所看到的:
typedef unsigned char jboolean; /* unsigned 8 bits */
typedef signed char jbyte; /* signed 8 bits */
typedef unsigned short jchar; /* unsigned 16 bits */
typedef short jshort; /* signed 16 bits */
typedef int jint; /* signed 32 bits */
typedef long long jlong; /* signed 64 bits */
typedef float jfloat; /* 32-bit IEEE 754 */
typedef double jdouble; /* 64-bit IEEE 754 */ typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
比如,为一个驱动加入HAL层,并创建JNI层。仅就JNI层而言,创建frameworks/base/services/jni/com_android_server_DemoService.cpp文件,该文件里用于描写叙述JNI接口的代码例如以下所看到的:
static const JNINativeMethod method_table[] = {
{"init_native", "()I", (void*)demo_init},
{"setVal_native", "(II)V", (void*)demo_setVal},
{"getVal_native", "(I)I", (void*)demo_getVal},
};
当中“(II)V”,表示函数的有两个整形參数,返回值为void。
注意:由參数二指定的函数參数和返回值类型一定要和C函数的參数和返回值保持一致,否则尽管编译可以通过,但在Android系统载入过程中,会报例如以下所看到的的错误,导致Android系统无法正常执行。
E/dalvikvm( 1737): ERROR: couldn't find native method
E/dalvikvm( 1737): Requested: Lcom/android/server/DemoService;.init_native:()Z
E/dalvikvm( 1737): Candidate: Lcom/android/server/DemoService;.init_native:()I
E/JNIHelp ( 1737): RegisterNatives failed for 'com/android/server/DemoService', aborting
F/libc ( 1737): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 1737 (system_server)
以上错误通发生在frameworks/base/services/jni/onload.cpp文件里的JNI_OnLoad()函数中,例如以下所看到的:
extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jint result = -1; if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
ALOGE("GetEnv failed!");
return result;
}
ALOG_ASSERT(env, "Could not retrieve the env!");
……
<strong>register_android_server_DemoService(env);</strong>
……
return JNI_VERSION_1_4;
}
另外,ProGuard对程序的优化也可能导致上述执行错误的发生。此时,能够在makefile文件里加入“LOCAL_PROGUARD_ENABLED:=disabled”宏来关闭ProGuard的优化。
关于ProGuard,能够參考其官方站点:http://proguard.sourceforge.net/
ProGuard是一个免费的Java类文件压缩器、优化器、混淆器和预校验器。它会检測并删除没实用到的类、域、方法以及属性。它最大限度的优化字节码而且删除没用的指令。它用非常短的没有意义的名字对剩余的类、域和方法进行重命名。最后,它对处理过的代码进行预校验。
ProGuard的一些用途例如以下:
A.为了更小的代码档案、更快的网络传输、更快的载入速度和更小的内存占用创建更紧凑的代码;
B.使程序和库难于进行反向project;
C.列出死代码,这样就能将其删除;
D.为Java 6或更高的版本号对存在的类文件进行重定位和预校验,以充分利用其高速载入类的性能。
Android系统JNI的实现方式的更多相关文章
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
在Android 2.3(Gingerbread) 系统的时候,我写过一篇关于“Android 震动马达系统“的文章,当时的Linux内核还是2.6版本的.写那篇文章的目的,是想彻底的了解从硬件到驱动 ...
- 深入浅出 - Android系统移植与平台开发(十二)- Android JNI机制
第五章.JNI机制 4.1 JNI概述 由前面基础知识可知,Android的应用层由Java语言编写,Framework框架层则是由Java代码与C/C++语言实现,之所以由两种不同的语言组合开发框架 ...
- Android系统关机或几种方式重启
---------------------------------------------------------------------------------------------------- ...
- OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)
OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰) 前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反 ...
- Android系统关机或重启的几种实现方式
前阵子工作上遇到一些关于Android系统关机或重启的系统修改,于是,做了一些尝试,也搜集了一下资料,现在整理一下,做一些总结,方便学习或者日后工作的需要. 默认的SDK并没有提供应用开发者直接的An ...
- Android系统固件定制方式
target_product.mkAndroid系统在构建关于某种产品的固件时,一般会根据特定于该产品的具体target_product.mk来配置生成整个Android系统./target_prod ...
- Android 通过JNI实现守护进程,使得Service服务不被杀死
来自: http://finalshares.com/read-7306 转载请注明出处: http://blog.csdn.net/yyh352091626/article/details/5054 ...
- 修改Android系统属性SystemProperties.set("sys.powerctl", "shutdown")关机分析
简介: 从之前的博文中我们提到过,关机流程中最后是通过修改Android属性进行关机操作(SystemProperties.java通过JNI调用访问系统属性),当然我们也可以通过adb命令修改And ...
- android的JNI 、 NDK 学习!
转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...
随机推荐
- GitHub 菜鸟使用
之前有用过一次,但是一直弄不明白怎么用,今天我又试了一下,成功了,现在我就记录下来,为了以后的使用以及帮助那些跟我原先一样不会用的同学 进入正题: Step 1: 注册GitHub账号 https:/ ...
- restful_api
http://www.ruanyifeng.com/blog/2014/05/restful_api.html
- WebService-06-CXF与Spring集成
前言 自3月份到一家快递公司之后,就极少有时间来写博客了,进去的第一个周末就加班.做公司的开放平台,协助一个小伙伴写WebService接口,用的就是CXF.正好这个东西曾经使用过.如今快7月了,曾经 ...
- New Relic——手机应用app开发达人的福利立即就到啦!
HiWork集成的第三方服务(机器人)将有新的添加啦,添加了BitBucket和New Relic.分别做下介绍啦! 1.BitBucket BitBucket 是一家源码托管站点.採用Mercuri ...
- 如何在Objective-C中实现链式语法?
在接触到开源项目 Masonry 后,里面的布局约束的链式写法让我颇感兴趣,就像下面这样: 1 2 3 4 5 6 7 8 UIEdgeInsets padding = UIEdgeInsetsMak ...
- AndroidContentProvider ContentResolver和ContentObserver的使用
1.ContentProvider.ContentResolver和ContentObserver ContentProvider是Android的四大组件之一,可见它在Android中 的作用非同小 ...
- inotify
inotify,文件系统控制函数,通知机制: ioctl, io控制函数
- EasyUI中datagrid实现显示、增加、 删除、 修改、 查询操作(后台代码C#)
菜鸟进入,高手请绕道! +++++++++++++++++++++++++++++++++++++++ 一.数据的显示 1新建HtmlPage2.html页面,引入相关文件.如下所示 <scri ...
- Oracle分析函数之开窗子句-即WINDOWING子句
Oracle的分析函数,对我们进行统计有很大的帮助,可以避免一些子查询等操作,在统计中,我们对开窗函数的接触较少,下面主要介绍下开窗函数的使用; http://www.itpub.net/thread ...
- IIS发布网站:CS0016: 未能写入输出文件的解决方法
“/”应用程序中的服务器错误.-------------------------------------------------------------------------------- 编译错误 ...