NDK-Java与native的互相调用

  • 内容
  • 评论
  • 相关

前言

http://27house.cn/archives/1097中,我介绍了下了如何编写一个简单的Demo来让native输出hello world到java层,接下来本篇主要介绍Java层调用native方法,以及native层调用Java层的方法以及修改Java对象的属性。

Java层调用native层的方法

其实在上一篇中已经介绍了下如何调用native层方法,其实与调用普通的Java方法没有什么区别,只是方法由native层实现的而已。

首先我们在Java类中编写native方法,然后使用上一篇博客中介绍的方法在native层实现之。

我们可以看到,只是将加法运算在native层实现而已,调用native方法与普通Java方法一样的,调用代码如下。

native层调用Java方法

Java数据类型的对应

在native层调用Java方法,首先得知道Java类型与native的对应关系,以及Java类型以及方法在native中的签名格式。

对于基础类型,对应关系如下。这些数据类型的定义全在jni.h中

对于非基础类型,比如String等,Array等统一对应jobject对象。

Java类型以及方法签名

在native中调用Java层的方法以及属性的时候需要使用相应的签名表示方法以及属性,下面就来介绍下基础类型与引用类型的签名表示方法。

从上面的表可以看到,基础类型是使用一个大写字母表示,对于数据则是使用[数组类型签名,比如int[]数组的签名为[I,一维数组是一个[,多维数组就是多个[[[,对于Java中的对象则是L类全路径;,不要忘记结尾的;号,对于对于函数方法则是(参数一签名参数二签名...)返回值签名,中间没有空格。

比如上面的 public native int calcInNative(int num1, int num2);方法的前面为(II)I,其他的类似。

native调用Java中的方法

首先我们得知道,任何jni的方法都需要通过JNIEnv *env参数去调用

native层调用Java层方法以及属性的时候类似于使用反射去调用Java的方法,基本分为如下几步。

1、获取jclass对象(类似于Java中的Class对象)

2、获取jmethodID或者jfieldID(类似于Java中的Method或者Field)

3、调用相应函数以及获取/修改属性值

native调用举例

由于本篇博客篇幅已经较长,所以这里只给出部分关键代码。下面为Java层代码。

对应的native层实现。

Demo地址:github

评论

0条评论

发表评论

电子邮件地址不会被公开。