NDK-Java与native的互相调用

/ 0评 / 1

前言

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

Java层调用native层的方法

其实在上一篇中已经介绍了下如何调用native层方法,其实与调用普通的Java方法没有什么区别,只是方法由native层实现的而已。首先我们在Java类中编写native方法,然后使用上一篇博客中介绍的方法在native层实现之。

package org.ndk.ndkfirst;

 public class NDKTest {

     private static final String TAG = NDKTest;

     static {
         System.loadLibrary(ndk-test-lib);
     }

     private String mString = Ndk test string;

     /**
      * 在native中进行加法运算
      */
     public native int calcInNative(int num1, int num2);
 }
#include <jni.h>

 extern C
 {
    JNIEXPORT jint JNICALL
    Java_org_ndk_ndkfirst_NDKTest_calcInNative(JNIEnv *env, jobject obj, jint num1, jint num2) {
        return num1 + num2;
    }
 }

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

NDKTest nDKTest = new NDKTest();
nDKTest.calcInNative(1, 2);

native层调用Java方法

Java数据类型的对应

在native层调用Java方法,首先得知道Java类型与native的对应关系,以及Java类型以及方法在native中的签名格式。对于基础类型,对应关系如下。这些数据类型的定义全在jni.h中

 #define JNI_FALSE   0
 #define JNI_TRUE    1
 typedef unsigned char   jboolean;       /* unsigned 8 bits */
 typedef signed char     jbyte;          /* signed 8 bits */
 typedef unsigned short  jchar;          /* unsigned 16 bits */
 typedef short           jshort;         /* signed 16 bits */
 typedef int             jint;           /* signed 32 bits */
 typedef long long       jlong;          /* signed 64 bits */
 typedef float           jfloat;         /* 32-bit IEEE 754 */
 typedef double          jdouble;        /* 64-bit IEEE 754 */

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

 class _jobject {};
 class _jclass : public _jobject {};
 class _jstring : public _jobject {};
 class _jarray : public _jobject {};
 class _jobjectArray : public _jarray {};
 class _jbooleanArray : public _jarray {};
 class _jbyteArray : public _jarray {};
 class _jcharArray : public _jarray {};
 class _jshortArray : public _jarray {};
 class _jintArray : public _jarray {};
 class _jlongArray : public _jarray {};
 class _jfloatArray : public _jarray {};
 class _jdoubleArray : public _jarray {};
 class _jthrowable : public _jobject {};

 typedef _jobject*       jobject;
 typedef _jclass*        jclass;
 typedef _jstring*       jstring;
 typedef _jarray*        jarray;
 typedef _jobjectArray*  jobjectArray;
 typedef _jbooleanArray* jbooleanArray;
 typedef _jbyteArray*    jbyteArray;
 typedef _jcharArray*    jcharArray;
 typedef _jshortArray*   jshortArray;
 typedef _jintArray*     jintArray;
 typedef _jlongArray*    jlongArray;
 typedef _jfloatArray*   jfloatArray;
 typedef _jdoubleArray*  jdoubleArray;
 typedef _jthrowable*    jthrowable;
 typedef _jobject*       jweak;

Java类型以及方法签名

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

从上面的表可以看到

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注