`

本地代码访问Java代码

 
阅读更多

(一)本地代码访问Java代码
1.在被调用的C/C++函数中也可以反过来访问java程序中的类
2.javah工具生成的C/C++函数声明中,可以看到两个参数:
JNIEXPORT void JNICALL Java_cn_itcast_sayHello(JNIEnv*

env,jobject obj){
···
}
(二)JNIEnv类型
(1)其实际代表Java环境。通过这个JNIEnv*指针,就可以对Java端

的代码进行操作。例如,创建Java类的对象,调用Java对象的方法,

获取Java对象的属性等等。JNIEnv的指针会被JNI传入到本地方法的

实现函数中来对Java端的代码进行操作。


(2)JNIEnv类中常用函数:
NewObject //创建一个java对象
NewString //创建一个java的String对象
New<TYPE>Array //创建某一个类型的java数组
Get/Set<TYPE>Field //获取或设置某一个对象的属性(需接收参数

GetStatic/SetStatic<TYPE>Field //获取或设置某一个类的静态属性
(需接收表示类的参数)
Call<TYPE>Method //调用某一类的方法
CallStatic<TYPE>Method //调用某一个类的静态方法

(三)Java的数据类型在C/C++中的映射关系
Java类型 本地类型 JNI定义的别名
int long jint/jsize
long _int64 jlong
byte signed char jbyte
boolean unsigned char jboolean
char unsigned short jchar
short short jshort
float float jfloat
double double jdouble
object _jobject* jobject


(四)jclass的取得
1.为了能够在C/C++中使用java类,JNI.h头文件中专门定义了jclass

类型来表是Java中的class类
2.JNIEnv类中取得jclass的函数:
(1)jclass FindClass(const char* clsName);
FindClass会在classpath系统环境变量下寻找类。传入完整类名,注

意包与包之间是用'/'而不是'.'来分隔
如:jclass cls_string=env->FindClass("java/lang/String");
(2)jclass GetObjectClass(jobject obj);
(3)jclass GetSuperClass(jclass obj);

(五)访问java类中的属性与方法
1.JNI在Jni.h头文件中定义了jfieldID,jmethodID类型来分别代表Java

端的属性和方法。
2.在访问或设置java属性时,需先在本地代码取得代表Java属性的

jfieldID;同理java方法亦然
3.获取ID方法(JNIEnv):
(1)GetFieldID/GetMethodID
GetMethodID也能取得构造函数的jmethodID.创建一个java对象时

可以调用指定的构造方法
如:env->GetMethodID(data_Clazz,"<init>","()V");
(2)GetStaticFieldID/GetStaticMethodID
类似java的Reflect,需要指定类跟属性/方法名来取得相应的jfieldID

跟jmethodID
(3)sign是什么
例如TestNative类中有两个重载方法:
package cn.itcast;
public class TestNative{
public void function(int i){
System.out.println("Integer:"+i);
}
public void function(double d){
System.out.println("Double:"+d);
}
}

然后在C/C++代码中需要调用其中一个function方法的话···
//首先取得要调用的方法所在的类···
jclass clazz_TestNative=env->FindClass("cn/itcast/TestNative");
//取得jmethodID之后才能进行调用···
jmethodID id_func=env->GetMethodID

(clazz_TestNative,"function","??");
······

但是到底取得是
void function(int i)还是
void function(double d)的jmethodID呢?

这就是sign的作用了,它用于指定要取得的属性/方法的类型
这里的sign
如果指定为"(I)V"则取回void function(int) 的jmethodID
如果指定为"(D)V"则取回void function(double)的jmethodID

(4)sign签名
用来表示要取得的属性/方法的类型
类型 相应的签名
boolean Z
byte B
char C
short S
int I
long L
float F
double D
void V
object L用/分隔包的完整类名: Ljava/lang/String;
Array [签名 [I [Ljava/lang/Object;
Method (参数1类型签名 参数2类型签名···)返回值类型签名

(五)使用签名取得属性/方法ID的例子
import java.util.Date;
public class Hello{
public int property;
public int function(int foo,Date date,int[] arr){
System.out.println("function");
return 0;
}
public native void test();
}

//test本地方法的实现:
JNIEXPORT void Java_Hello_test(JNIEnv* env,jobject obj){
//因为test不是静态函数,所以传进来的就是调用这个函数的对象
//否则就传入一个jclass对象表示native()方法所在的类
jclass hello_clazz=env->GetObjectClass(obj);
jfieldID filedID_prop=env->GetFieldID

(hello_calzz,"property","I");
jmethodID methodID_func=env->GetMethodID

(hello_clazz,"function","(I Ljava/util/Date; [I)I");
env->CallIntMethod(obj,methodID_func,OL,NULL,NULL);
}

(六)使用javap命令来产生签名
1.javap -s -p [full class Name]
-s 表示输出签名信息
-p 同-private,输出包括private访问权限的成员信息

分享到:
评论

相关推荐

    java 本地代码访问注册表

    这是一个java通过本地接口访问的源代码,在windows操作系统上试验成功,对于想学本地方法的有 帮助,代码中有JAVA与C语言的原始数据、对象及数组交互,有本地库中抛出例外,构造器调用等知识点,比较全面。

    java访问本地

    在“nativeCode3”中,可能涉及到更高级的JNI操作,如访问Java对象的字段、数组操作、异常处理、线程管理等。这些功能允许本地代码直接操作Java对象,提供了更大的灵活性。例如,本地代码可以读取或修改Java对象的...

    通过本地java代码访问wsdl接口

    标题中的“通过本地Java代码访问WSDL接口”指的是在Java编程环境中,利用WSDL(Web Service Description Language)文件来创建客户端代理类,从而调用远程Web服务。WSDL是一种XML格式,它定义了Web服务的接口,包括...

    JNI本地方法访问Java端的属性和方法共9页.pdf.z

    总的来说,《JNI本地方法访问Java端的属性和方法共9页》这份文档将详细讲解如何利用JNI实现本地代码与Java对象的交互,涵盖字段访问和方法调用等多个方面,对于理解和掌握JNI技术具有很高的参考价值。通过深入学习和...

    JNI详解技术.ppt

    5. **本地代码访问Java代码** - 在C/C++本地方法中,可以通过`JNIEnv`指针调用Java代码。`JNIEnv`提供了丰富的API,例如创建Java对象、调用Java方法、访问和修改字段值。 6. **JNI数据类型映射** - JNI定义了一套...

    Java本地调用接口 JNative

    - **本地代码调用Java方法**:通过JNIEnv指针,本地代码可以访问和调用Java对象的方法,访问Java数组,甚至创建新的Java对象。 6. **JNI数据类型和转换** JNI定义了一套与Java类型对应的本地类型,如`jboolean`, ...

    基于Java的本地代码绑定工具 jSegue.zip

    【Java本地代码绑定工具 jSegue】是一个专门为Java开发者设计的工具,它允许Java应用程序与本地(C或C++)代码进行交互,实现高效的性能优化或者利用特定的本地库功能。这个工具的核心概念是通过JNI(Java Native ...

    java源码:Java本地代码绑定工具 jSegue.zip

    虽然jSegue简化了本地代码的集成,但使用本地代码可能会带来性能上的优势,因为本地代码可以更直接地访问硬件资源。然而,需要注意的是,Java和本地代码之间的交互可能会引入额外的开销,因此在性能敏感的场景下,...

    android中本地代码调用上层java的实例

    本实例主要探讨如何在Android的本地代码(C/C++)中调用上层Java代码,实现混合编程。这种方式常用于优化性能、利用已有的C库或者实现特定的硬件接口。 1. **JNI(Java Native Interface)**: JNI是Java平台标准...

    Java 本地接口规范

    JNI提供了Java虚拟机(JVM)与本地代码之间的一套API,允许Java代码调用本地函数或访问本地数据,同时支持本地代码调用Java方法。这种双向的交互能力极大地扩展了Java的应用范围,使其能够在各种平台上运行,并利用...

    基于Java的源码-本地代码绑定工具 jSegue.zip

    JNI提供了一种方式,让Java代码可以与本地代码进行通信,使得Java应用程序能够利用C和C++的强大功能。通过JNI,开发者可以编写Java类,这些类包含本地方法,这些方法可以在运行时被本地代码实现。 在jSegue中,主要...

    基于java的本地代码绑定工具 jSegue.zip

    Java本地代码绑定工具jSegue是一个强大的开发工具,主要用于在Java应用程序中无缝地集成本地(C或C++)代码。这个工具提供了一种高效的方式来调用本地库,使得Java开发者能够利用Java平台无法直接支持的特定功能或者...

    Java本地访问.zip

    JNI接口定义了如何在Java代码中声明本地方法,以及如何在本地代码中实现这些方法。这涉及到了Java头文件的生成、本地方法签名的定义以及本地代码的编译和链接过程。 接着,我们来看看Java Native Access(JNA)。...

    java搭建本地服务器,android客户端访问

    下面将详细阐述如何使用Java搭建本地服务器,并让Android客户端进行访问。 首先,Java作为后端语言,可以通过多种框架来搭建服务器。例如,我们可以使用轻量级的Spring Boot框架,它简化了创建独立的、生产级别的...

    Java本地代码绑定工具 jSegue.7z

    总的来说,jSegue提供了一套完整的解决方案,使得Java开发者能够轻松地与本地代码进行交互,无论是数据库访问、系统事件日志记录还是使用特定平台的API。使用这个工具,开发者可以充分利用Java的跨平台优势,同时...

    JavaME源程序代码

    6. **数据存储**:如Record Store API,是JavaME中的本地数据存储解决方案。 通过研究和实践这些JavaME源程序代码,开发者可以掌握如何在资源有限的设备上进行高效编程,了解如何利用JavaME的特性创建跨平台的应用...

    JAVA上百实例源码以及开源项目源代码

    Java访问权限控制源代码 1个目标文件 摘要:Java源码,文件操作,权限控制 Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流...

    java swing 调用本地摄像头

    这段代码创建了一个简单的Java Swing窗口,并尝试打开本地的默认摄像头。如果摄像头可用,它会将视频流显示在窗口中。请注意,`vfw://0` 是指Windows上的VFW(Video for Windows)接口,如果你在其他操作系统上,如...

Global site tag (gtag.js) - Google Analytics