通过jni例子来了解jni 实现机制

 

通过对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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值