android jni编程 ,java 与c++互调
背景:当时在做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 */
#endif
(2)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.类型签名这里写图片描述
关于jni中类型的签名:
Java支持函数重载,也就是说,可以定义同名但不同参数的函数,所以仅仅根据函数名,没有办法找到具体的函数,为了解决这个问题,JNI技术中就将参数类型和返回值类型的组合,作为了一个函数签名的信息,有了签名信息,和函数名,就能很顺利的找到java中的函数了。
JNI规范定义的函数签名信息
(参数1类型标示;参数2类型标示......)返回值类型标示
譬如:
private native void processFile(String path,String mimeType,MediaScannerClient client)
对应的jni函数签名就是:
当参数为引用类型的时候,参数类型的标示的格式为”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")
上一篇: 在vue.js中如何导出Excel表格
下一篇: 怎样实现硬件访问服务
推荐阅读
-
Android 模拟器(JAVA)与C++ socket 通讯 分享
-
Android编程使用WebView实现与Javascript交互的方法【相互调用参数、传值】
-
Android 模拟器(JAVA)与C++ socket 通讯 分享
-
Android JNI c/c++调用java的实例
-
JNI接口 创建一个Java调用C++实例 涉及JAVA与C++之间的参数传递问题
-
Unity通过NDK、JNI实现C#、java、C/C++之间的相互调用
-
Android JNI-c/c++调用java方法
-
android java 与 c++ 相互调用的方法
-
android jni编程 ,java 与c++互调
-
Android JNI编程 与 NDK开发(二) AS 2.2以上NDK开发 CMake篇