Android源码分析---JNI浅尝
2014-11-22 00:38
417 查看
JNI=java native interface,是一种技术,通过这种技术可以做到:java代码调用C/C++代码,C/C++代码代用java代码
java层的代码,首先调用System.loadLibrary();然后调用声明为native的java函数,声明为native的函数JVM会去JNI库那里找对应的JNI函数调用
而JNI函数那边是用C/C++语言写的,故可以使用printf()这些函数,下面是一个简单例子:
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层的类成员了。
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 __cplusplus extern "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层的类成员了。
相关文章推荐
- [Android源码分析]蓝牙配对之jni之上的点点滴滴
- ReactNative4Android源码分析1: JNI智能指针之介绍篇
- [Android源码分析]jni层之下的配对分析
- Android framework源码之JNI实现过程分析
- android 动态注册JNI函数过程源码分析
- [Android源码分析]蓝牙打开流程分析——jni层之下的偷偷摸摸(Service Record的创建)
- android源码分析之JNI调用与回调
- android源码分析之JNI调用与回调
- android中jni加载流程源码分析
- Android源码分析实战之JNI so库加载System.loadLibrary流程分析
- android 移植 ffmpeg (二) 源码分析 JNI编程说明
- android开发源码分析--多个activity调用多个jni库的方法
- [Android源码分析]蓝牙打开分析--苦尽甘来之再次回到jni之上
- android 动态注册JNI函数过程源码分析
- Android IPC 通讯机制源码分析2(转)
- Android IPC 通讯机制源码分析
- Android App 源码分析(贪吃蛇游戏)
- Android 2.1 源码结构分析