Android源码分析---JNI浅尝

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层的类成员了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值