欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android jni编程 ,java 与c++互调

程序员文章站 2022-06-06 20:34:12
...

背景:当时在做cocos2dx时,记录下的关于jni编程的东西整理.

1.jni中主要的一些数据类型的定义和一些结构体的定义:存在于一个文件中: jni.h:
\android-ndk-r8b\platforms\android-14\arch-arm\usr\include\jni.h 路径
(1)数据类型 ,例如:

/*
 * Primitive types that match up with Java equivalents.
 */
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>      /* C99 */
typedef uint8_t         jboolean;       /* unsigned 8 bits */
typedef int8_t          jbyte;          /* signed 8 bits */
typedef uint16_t        jchar;          /* unsigned 16 bits */
typedef int16_t         jshort;         /* signed 16 bits */
typedef int32_t         jint;           /* signed 32 bits */
typedef int64_t         jlong;          /* signed 64 bits */
typedef float          jfloat;         /* 32-bit IEEE 754 */
typedef double          jdouble;        /* 64-bit IEEE 754 */
#else
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 */
#endif2)jniEnv数据结构的定义与说明:
/*
 * C++ object wrapper.
 *
 * This is usually overlaid on a C struct whose first element is a
 * JNINativeInterface*.  We rely somewhat on compiler behavior.
 */
struct _JNIEnv {

2.cocos2d-x引擎对jni的操作进行了封装,提供了一个非常好用的类:JniHelper,定义了一些常用的接口,该文件位于cocos2dx/platform/android/jni目录下

3.类型签名这里写图片描述android jni编程 ,java 与c++互调

关于jni中类型的签名:
Java支持函数重载,也就是说,可以定义同名但不同参数的函数,所以仅仅根据函数名,没有办法找到具体的函数,为了解决这个问题,JNI技术中就将参数类型和返回值类型的组合,作为了一个函数签名的信息,有了签名信息,和函数名,就能很顺利的找到java中的函数了。
JNI规范定义的函数签名信息

(参数1类型标示;参数2类型标示......)返回值类型标示
 譬如:
 private native void processFile(String path,String mimeType,MediaScannerClient client)
 对应的jni函数签名就是:

android jni编程 ,java 与c++互调
当参数为引用类型的时候,参数类型的标示的格式为”L包名” 其中包名的.(点)换成”/”看上面的例子 就不多解释了。
另外引用类型(除基本类型的数组外)的标识最后都有一个”;”分号
如果java类型是数组,则标示中会出现一个“[”

public string addTail(String tail, int index)
  对应签名如下:
  (Ljava/lang/String;I)Ljava/util/String;

public int addValue(int index, String value,int[] arr)
  对应签名:
    (ILjava/lang/String;[I)I

4.
getStaticMethodInfo用来判断Java的类静态函数是否存在,并初始化结构体JniMethodInfo,该结构体封装了JNIEnv*和java.lang.Class对象、函数ID。这样就可以使用JNIEnv*调用 CallStaticXXXMethod(jclass clazz, jmethodID methodID, …)和 CallXXXMethod(jobject obj, jmethodID methodID, …)等常用函数(XXX替换为函数返回值类型,如:Void,Int等)。
第一个参数为JniMethodInfo,第二个参数是类的绝对路径,第三个参数是函数名,第四个参数是函数签名(参数和返回类型)
eg:

if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "showTipDialog", "(Ljava/lang/String;Ljava/lang/String;)V")
相关标签: jni