`
747017186
  • 浏览: 331333 次
社区版块
存档分类
最新评论

jni学习实例(2)

    博客分类:
  • java
 
阅读更多
 

Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

转:http://blog.csdn.net/jiangwei0910410003/article/details/17465457

上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用

首先来看一下C++中的sayHello方法的实现:

 

[cpp] view plain copy
 
  1. JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj)  
  2. {  
  3. cout<<"Hello World"<<endl;  
  4. }  

 

对于这个方法参数中的JNIEnv* env参数的解释:

JNIEnv类型实际上代表了Java环境,通过这个JNIEnv* 指针,就可以对Java端的代码进行操作。例如,创建Jaa类中俄对象,调用Java对象的方法,获取Java对象中的属性等等。JNIEnv的指针会被JNI传入到本地方法的实现函数中来对Java端的代码进行操作。

JNIEnv类中有很多函数可以用:

NewObject:创建Java类中的对象

NewString:创建Java类中的String对象

New<Type>Array:创建类型为Type的数组对象

Get<Type>Field:获取类型为Type的字段

Set<Type>Field:设置类型为Type的字段的值

GetStatic<Type>Field:获取类型为Type的static的字段

SetStatic<Type>Field:设置类型为Type的static的字段的值

Call<Type>Method:调用返回类型为Type的方法

CallStatic<Type>Method:调用返回值类型为Type的static方法

等许多的函数,具体的可以查看jni.h文件中的函数名称。

 

参数:jobject obj的解释:

如果native方法不是static的话,这个obj就代表这个native方法的类实例

如果native方法是static的话,这个obj就代表这个native方法的类的class对象实例(static方法不需要类实例的,所以就代表这个类的class对象)

 

下面来看一下Java和C++中的基本类型的映射关系:


具体的说明可以查看jni.h文件。

 

为了能够在C/C++中使用Java类,jni.h头文件中专门定义了jclass类型来表示Java中的Class类

JNIEnv类中有如下几个简单的函数可以取得jclass:

jclass FindClass(const char* clsName):通过类的名称(类的全名,这时候包名不是用.号,而是用/来区分的)来获取jclass

如: jclass str = env->FindClass("java/lang/String");获取Java中的String对象的class对象。

jclass GetObjectClass(jobject obj):通过对象实例来获取jclass,相当于java中的getClass方法

jclass GetSuperClass(jclass obj):通过jclass可以获取其父类的jclass对象

 

在C/C++本地代码中访问Java端的代码,一个常见的应用就是获取类的属性和调用类的方法,为了在C/C++中表示属性和方法,JNI在jni.h头文件中定义了jfieldId,jmethodID类型来分别代表Java端的属性和方法

我们在访问,或者设置Java属性的时候,首先就要先在本地代码取得代表该Java属性的jfieldID,然后才能在本地代码中进行Java属性操作,同样的,我们需要呼叫Java端的方法时,也是需要取得代表该方法的jmethodID才能进行Java方法调用

 

使用JNIEnv的:

GetFieldID/GetMethodID

GetStaticFieldID/GetStaticMethodID

来取得相应的jfieldID和jmethodID

下面来具体看一下这几个方法:

GetFieldID(jclass clazz,const char* name,const char* sign)

方法的参数说明:

clazz:这个简单就是这个方法依赖的类对象的class对象

name:这个是这个字段的名称

sign:这个是这个字段的签名(我们知道每个变量,每个方法都是有签名的)

怎么查看类中的字段和方法的签名:

使用javap命令:


GetMethodID也能够取得构造函数的jmethodID,创建一个Java对象时可以调用指定的构造方法,这个将在后面向大家介绍:

如:env->GetMethodID(data_Class,"<init>","()V");

下面看一下签名的格式:


下面来看一下例子:

这里没有上代码了:真正演示的时候等下一篇内容,这一篇只是说一下方法的使用:



下一篇我们将来说一下这些方法到底是怎么用的。

 

分享到:
评论

相关推荐

    android JNI学习三实例

    在这个"android JNI学习三实例"中,我们将深入探讨如何在Android应用开发中使用JNI。 一、JNI简介 JNI是Java平台的一部分,提供了一套接口,让Java代码能够调用本地(native)代码,同时也允许本地代码调用Java对象...

    第一个JNI实例学习

    在这个"第一个JNI实例学习"中,我们将探讨如何创建并运行一个基本的JNI程序。 首先,我们需要理解JNI的核心概念。JNI提供了一套接口,让Java代码能够声明本地方法,这些方法在运行时由本地(非Java)代码实现。本地...

    java jni简单实例

    本资源提供的“java jni简单实例”是一个实际应用JNI的示例,有助于学习和理解JNI的工作原理。 首先,我们来看JNI的核心概念: 1. **本地方法接口**:JNI定义了一套接口,使得Java代码能够声明本地方法(即非Java...

    Jni完整实例

    通过这个“Jni完整实例”,你可以学习到以下关键知识点: 1. JNI接口设计:如何在Java中声明本地方法,以及在C/C++中实现这些方法。 2. NDK环境配置:Eclipse的NDK插件设置,以及NDK-build的使用。 3. 项目结构:...

    Android jni 编程实例

    在这个"Android jni 编程实例"中,我们将探讨如何在Android Studio环境下进行JNI开发,通过一个简单的入门demo来学习这个过程。 首先,我们需要了解JNI的基本概念。JNI是Java平台提供的一种接口,它允许Java代码...

    jni教程实例手把手

    在这个“jni教程实例手把手”资源中,包含了多个文档和一个示例项目,旨在帮助学习者全面理解并掌握JNI的使用。 1. **Android_JNI总结.doc**:这份文档可能是对Android平台上JNI应用的总结,涵盖了JNI的基本概念、...

    android JNI学习四实例

    Android JNI(Java Native Interface)是...通过学习这些实例,你可以掌握JNI的基本用法,包括调用本地方法、数据类型转换、回调以及文件操作等。这些知识对于开发高性能的Android应用或利用现有C/C++库至关重要。

    jni实例 已Eclipse测试可用

    2. **编写本地方法实现**:使用JNI头文件生成工具(如`javah`)生成C/C++的头文件,然后在这个头文件中定义本地方法的实现。例如,生成的头文件可能包含以下内容: ```c #include "JniTest.h" JNIEXPORT void ...

    Java再说JNI之实例

    Java再次探讨JNI(Java Native Interface)这一主题,其主要目的是为了解决Java语言与本地代码交互的问题。...通过学习这些实例,开发者可以进一步提升在Java中使用JNI的能力,解决特定问题并提升程序性能。

    Android JNI应用实例

    在"Android JNI应用实例"中,我们可以深入学习如何使用JNI。通常,一个简单的JNI开发流程包括以下步骤: 1. 创建Java类:首先,我们需要在Java层定义一个类,声明native方法,这些方法将在C/C++代码中实现。 2. ...

    JNI实例

    这篇博客文章“JNI实例”可能详细介绍了如何在实际项目中应用JNI。 在Java中,JNI提供了接口让Java代码能够调用本地(native)代码,本地代码可以是用C、C++或者其他支持的语言编写。这个过程包括以下几个关键步骤...

    android_JNI学习一实例

    在这个实例中,我们将深入理解JNI的工作原理,并通过实际操作来学习如何在Android项目中使用JNI。 首先,我们需要了解JNI的基本概念。JNI是一种接口,让Java应用程序能够调用本地方法(即非Java语言编写的方法)。...

    CarDVR jni使用实例

    学习这个实例,开发者可以更好地理解JNI的工作机制,掌握如何在实际项目中使用JNI进行跨语言交互,这对于开发如嵌入式系统、Android应用或者需要高性能计算的Java应用等有很大帮助。通过实践,你将能够灵活运用JNI来...

    Android Studio JNI编程入门实例

    JNI(Java Native Interface...同时,CMakeLists.txt作为现代的构建系统,提供了更多高级功能,如自动依赖检测、跨平台支持等,也值得学习掌握。不断深入理解JNI,可以让你在Android开发中游刃有余,解决各种复杂问题。

    Java jni调用c实例

    Java JNI(Java Native Interface)是Java平台...这个实例展示了Java和C/C++之间的交互,是学习和理解JNI机制的一个基础示例。通过掌握JNI,开发者可以充分利用两种语言的优点,如Java的跨平台性和C/C++的高效性能。

    JNI学习资料-有图有真相

    通过阅读提供的"JNI学习资料-有图有真相.doc"文档,你可以更深入地了解这些概念,并通过实例学习如何实际应用JNI。文档中的图形和示例将有助于直观理解复杂的概念,从而提升你的JNI开发技能。记得在实践过程中,不断...

    jni学习例子 在linux下执行成功

    在本示例中,我们看到的是一个JNI的学习实践,它在Linux环境下成功地执行了。这个例子展示了如何通过Java调用本地(C/C++)代码,并且提供了完整的流程,包括从Java类型转换为C类型,特别是将`jstring`转化为`char`...

    Android Jni调用实例

    2. **生成JNI头文件**:使用`javah`命令(在Android Studio中通常是`javac -h`)根据Java类生成对应的JNI头文件,例如`NativeDemo.h`。这个头文件包含了Java方法的C/C++原型。 3. **编写C/C++代码**:在生成的...

    Android JNI应用实例02

    Android JNI(Java Native Interface)是Android开发中的一个重要概念,它为Java代码提供了与本地C/C++代码交互的能力。...通过学习这个实例,开发者可以加深对Android JNI的理解,提高在实际项目中应用JNI的能力。

    JNI学习(三)之实例分析

    2. **JNI头文件生成**:在使用JNI前,通常需要使用`javah`工具从Java类中生成对应的C/C++头文件。这个头文件包含了Java方法的本地方法签名,是JNI编程的基础。 3. **本地方法签名**:每个Java方法在JNI中都有一个...

Global site tag (gtag.js) - Google Analytics