您的位置:首页 > 移动开发 > Android开发

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()这些函数,下面是一个简单例子:

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层的类成员了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: