Android源码分析---JNI浅尝

来源:互联网 发布:nodejs 官网cms 编辑:程序博客网 时间:2024/06/06 02:24

JNI=java native interface,是一种技术,通过这种技术可以做到:java代码调用C/C++代码,C/C++代码代用java代码


java层的代码,首先调用System.loadLibrary();然后调用声明为native的java函数,声明为native的函数JVM会去JNI库那里找对应的JNI函数调用

而JNI函数那边是用C/C++语言写的,故可以使用printf()这些函数,下面是一个简单例子:

class HelloWorld {public native void displayHelloWorld();static {System.loadLibrary("hello");}public static void main(String[] args) {new HelloWorld().displayHelloWorld();}}
利用javah工具可以生成一个.h文件:

javah ?jni HelloWorld头文件的内容:/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class HelloWorld */#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/** Class: HelloWorld* Method: displayHelloWorld* Signature: ()V*/JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
然后建立一个.c或者.cpp来包含这个头文件,就可以使用C/C++语言来写代码:

JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) {printf("Hello world!\n");return;}


displayHelloWorld()声明为native函数不能再java层实现,它会调用对应的java_HelloWorld_displayHelloWorld,其中JNIEnv是线程相关的一个JNI函数组合,利用env可以调用许多JNI的内部函数,也是通过这个来实现在C/C++代码中访问java的类对象。

总结下就是先找出一个类中成员函数和成员变量的ID,然后用Call<Type>Method来根据函数ID来调用java层的函数,用Get<type>Field来获取成员ID的值,这样就在C/C++中调用了Java层的类成员了。



0 0
原创粉丝点击