通过对Lua语言和C/C++语言的混合时候,对于语言间混合使用有了初步的了解.
但是Lua和C/C++语言交换的原理是具有GC垃圾收集器来管理内存的语言和手动内存管理的典型代表.
同样Java语言与C/C++/Object-c语言交换也存在这些问题.在java中使用JNI技术来解决这个问题.
这些问题涉及到如下方面:
1 - java动态语言中的基本类型,Object类以及自定类如何与C/C++/Object-c的语言类型进行映射.???
2 - java动态语言如何调用C/C++/Object-c 中方法.???
3- C/C++/Object-c语言如何调用java语言中的方法.???
4- C/C++/Object-c 与java语言中堆内存产生的内存如何管理???
Lua语言通过ANSI C语言实现,本身提供很少语言级API. 但是java作为一种强大的通用型语言,提供网络,文件,数据库等各种强大的库,同时,java作为一种跨平台通用型语言必须解决平台间的差异,
所以,java jni技术相对lua 与C/C++交换的复杂程度不在同一个数量基本. lua与c/c++仅仅需要精通c/c++语言,而java与c/++同时要精通两种庞大的语言,所以复杂行可想而知.
在这里我们仅仅作为了解来看JNI技术.
首先在jni.h文件中头文件中罗列了java语言与C/C++/Object-c语言相互交换所涉及的所有东西.在Lua与C/C++中涉及的这一部分仅仅这这里罗列的不及百分之一吧.
上代码:
jni.h 文件:
/*
* We used part of Netscape's Java Runtime Interface (JRI) as the starting point of our design and implementation.
*/
//在JDK7 -windows -64bit下是通过JRI来设计和实现JNI.
/******************************************************************************
* Java Runtime Interface
* Copyright (c) 1996 Netscape Communications Corporation. All rights reserved.
*****************************************************************************/
#ifndef _JAVASOFT_JNI_H_
#define _JAVASOFT_JNI_H_
#include <stdio.h>
#include <stdarg.h>
/* jni_md.h contains the machine-dependent typedefs for jbyte, jint and jlong */
/*jni_md.h为jni.h的补充文件,用来根据平台不同来定义 jbtye,jint 和jlong类型*/
#include "jni_md.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
* JNI Types
*/
#ifndef JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H
//为跨平台来定义基本的java原始类型
typedef unsigned char jboolean; //布尔类型为java基本类型,底层char类型来实现.可能因为c语言在c99版本才增加布尔类型导致的.
typedef unsigned short jchar;
typedef short jshort;
typedef float jfloat; //浮点类型1
typedef double jdouble; //浮点类型2
typedef jint jsize;
#ifdef __cplusplus
//定义java基础类
class _jobject {};
class _jclass : public _jobject {};
class _jthrowable : public _jobject {};
class _jstring : public _jobject {};
class _jarray : public _jobject {};
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 _jobjectArray : public _jarray {};
typedef _jobject *jobject;
typedef _jclass *jclass;
typedef _jthrowable *jthrowable;
typedef _jstring *jstring;
typedef _jarray *jarray;
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 _jobjectArray *jobjectArray;
#endif
typedef jobject jweak;
//java作为一种通用的脚本语言定义的值类型
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
struct _jfieldID;
typedef struct _jfieldID *jfieldID;
struct _jmethodID;
typedef struct _jmethodID *jmethodID;
/* Return values from jobjectRefType */
typedef enum _jobjectType {
JNIInvalidRefType = 0,
JNILocalRefType = 1,
JNIGlobalRefType = 2,
JNIWeakGlobalRefType = 3
} jobjectRefType;
#endif /* JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H */
/*
* jboolean constants 布尔类型常量
*/
#define JNI_FALSE 0
#define JNI_TRUE 1
/*
* possible return values for JNI functions. Java调用C/C++函数的返回值
*/
#define JNI_OK 0 /* success */
#define JNI_ERR (-1) /* unknown error */
#define JNI_EDETACHED (-2) /* thread detached from the VM */
#define JNI_EVERSION (-3) /* JNI version error */
#define JNI_ENOMEM (-4) /* not enough memory */
#define JNI_EEXIST (-5) /* VM already created */
#define JNI_EINVAL (-6) /* invalid arguments */
/*
* used in ReleaseScalarArrayElements
*/
#define JNI_COMMIT 1
#define JNI_ABORT 2
/*
* used in RegisterNatives to describe native method name, s