JNI(Java Native Interface)
来源:互联网 发布:武汉seo公司jw100 编辑:程序博客网 时间:2024/06/05 09:08
JNI Java本地接口,即C/C++(统称C)语言,为什么在Java程序设计中使用C语言?
- 调用Driver,调用操作系统驱动的C接口;
- 考虑运行效率,C的效率比Java高得多,对大量数据处理更适合;
- 重用已有C代码,对于已知的模块C已经实现,不需要再用Java实现;
在程序的角度,JNI就是实现Java访问C和C访问Java,从而进行Java和C的应用组合,Android Framework中就大量使用了JNI完成本地接口的实现。
Java访问C:
Java中声明native函数,具体实现在C中,编译时Java编译器也不会关心native函数的实现;运行时会先加载C所生成的动态库,再调用native方法,否则会报找不到相应native错。
Java中声明的函数名称和C中实现的函数名称是不同的,后者等于包名加前者的名称,并且中间以下划线分隔。eg:
Java:private native final void init();
C 中:static void anroid_content_AssentManager_init(JNIEnv* env, jobject clazz);
这是一种编程规范,Java调用native时,编译器会向native引擎传递调用者的包名,函数名和参数类型,native引擎根据这些信息决定调用哪个native函数。同时native引擎中AndroidRuntime类提供了registerNativeMethods()来定义Java native函数和C函数名称的映射关系。
C函数中至少包含两个参数(JNIEnv对象和jobject)。JNIEnv是Java虚拟机(JVM)运行的环境,通过它可以访问JVM内部的各种对象;jobject则是调用改函数的对象;若native函数本身也有参数,则依次放在这两个参数后面。
同样,Java代码不能直接访问C中的变量,因为C中的变量对于Java都是私有的,只能通过C提供get()/set()间接访问。C访问Java:
C访问Java不能通过函数指针,只能通过通用的参数接口,正如Java调用C一样,需要把想要访问的类名,函数名和参数传递给Java引擎,由Java引擎去执行。
步骤为:获取Java对象的类 —> 获取Java函数的id值 —> 调用该函数
其中,C调用Java函数只能在Java调用C函数中进行,因此C访问Java的原则就是“你不惹我,我不惹你”。
同样,C访问Java中的变量步骤为:获取Java对象的类—>获取变量的id值—>获取变量值。
- JNI(Java Native Interface)
- JNI(Java Native Interface)
- JNI:Java Native Interface
- JNI(java native interface)
- JNI - Java Native Interface
- JNI:Java Native Interface
- Java Native Interface (JNI)
- Java Native Interface (JNI)
- JNI:Java Native Interface
- JNI:Java Native Interface
- Java JNI(Java Native Interface)
- java JNI(java native interface)
- JNI(Java Native Interface)的使用
- JNI(Java Native Interface)的使用
- JNI(Java Native Interface)的使用
- JNI调用(Java Native Interface)
- JNI(Java Native Interface)首次使用
- JNI (Java Native Interface)是什么
- SpringIoc BeanDefinition载入交互过程
- 清除ViewPager+FragmentPagerAdapter的缓存
- dg的switchover
- Java并发编程:volatile关键字解析
- Qt 隐藏标题栏可移动升级版
- JNI(Java Native Interface)
- HTML
- datatables样式详解,[基于thinkPHP]多条件按钮搜索及行样式
- 修改mongodb oplog size
- mysql select into outfile 意表备份还原方式
- 如何通过远程连接服务器上的MySQL
- Object详解
- Volatile关键字详解,以及需要注意的地方
- 'dependencyManagement.dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: