`
scliu0718
  • 浏览: 52316 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Jni开发代码简介

 
阅读更多

JNI中方法参数:

jstring Java_com_utils_INative_stringFromJNI(JNIEnv* env,

jobject thiz, jstring obj) {
return (*env)->NewStringUTF(env, "XXX");

}

此方法中有三个参数:

第一个env是结构体的函数表-->JavaNativeInterface的接口。

第二个参数thiz区别当前方法为静太方法或者实例方法,当方法是一个实例方法时,则此参数相当于对象本身,即类似this关键字; 当方法为一个静态方法时,thiz将指向所在的类。

第三个参数obj则是由java定义时传过来的参数,类型可多种类型。


在JNI中数据类型对应时,C/C++的类型格式是:在java的数据类型前加上"j"。如:int --->jint

而Java中的“String” 则需要通过env->NewStringUTF(env, "");来得到“jstring"对应其类型,除此之外,在jni中还定义了'jclass'对应java中的"Class"类、“jobject”对应java中的“Object”。


字符串转换:

char * c ;

c = env->GetStringUTFChars(env, obj, null);//可返回char

env->RealeseStringUTFChars(env, obj, c);//销毁GetStringUTFChars时分配的内存

jstring str =env->NewStringUTF(env, c);


获取Java类的成员并修改:

Java:

class InstanceFieldAccess {
     private String s;
     private native void accessField();
     public static void main(String args[]) {
     InstanceFieldAccess c = new InstanceFieldAccess();
     c.s = "abc";
     c.accessField();
     System.out.println("In Java:");
     System.out.println(" c.s = \"" + c.s + "\"");
     }
    static {
          System.loadLibrary("InstanceFieldAccess");
    }
}

C:

JNIEXPORT void JNICALLJava_InstanceFieldAccess_accessField(JNIEnv *env, jobject obj){ 
     jfieldID fid; /* store the field ID */  
     jstring jstr;  
     const char *str;  /* Get a reference to obj’s class */
     jclass cls = (*env)->GetObjectClass(env, obj);  

     fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");  
     printf("In C:\n");
     if (fid == NULL) {    
          return; /* failed to find the field */ 
     }    
     jstr = (*env)->GetObjectField(env, obj, fid);  
     str = (*env)->GetStringUTFChars(env, jstr, NULL);  
     if (str == NULL) {    
          return; /* out of memory */
     }  
     printf(" c.s = \"%s\"\n", str);
     (*env)->ReleaseStringUTFChars(env, jstr, str);  /* Create a new string and overwrite the instance field */  
     jstr = (*env)->NewStringUTF(env, "123");  
     if (jstr == NULL) {    
          return; /* out of memory */ 
     }  
     (*env)->SetObjectField(env, obj, fid, jstr);
}

输出:

In C: c.s = "abc" In Java: c.s = "123"


访问对象成员分两步,首先通过 GetFieldID 得到对象成员 ID, 如下:fid =(*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");
示例代码,通过 GetObjectClass 从 obj 对象得到 cls.这时,通过在对象上调用下述方法获得成员的值:jstr =(*env)->GetObjectField(env, obj, fid);
示例中要得到的是一个对象类型,所以用 GetObjectField. 此外 JNI 还提供Get/SetIntField,Get/SetFloatField 访问不同类型成员。
译者:通过 JNI 方法访问对象的成员,JNI 对应的函数命名非常有规律,即 Get/Set<ReturnValue Type>Field。







分享到:
评论

相关推荐

    jni开发代码

    本资料“jni开发代码”可能是2016年11月24日时关于JNI编程的一次实践或教程。 JNI的核心概念包括以下几个方面: 1. **本地方法接口(Native Method Interface)**:JNI提供了一套接口,让Java程序员可以在Java代码...

    NDK JNI开发例子代码2

    本示例代码"NDK JNI开发例子代码2"将深入探讨如何在Android应用中使用NDK和JNI进行原生编程。 首先,我们需要理解NDK的作用。在Android应用中,主要的编程语言是Java,但有时为了优化性能,如图形处理、数学计算或...

    JNI开发 eclipse相关开发环境的搭建

    JNI(Java Native Interface)是 Java 调用本地代码的接口,广泛应用于 Android 开发中。为了更好地开发 JNI 项目,需要搭建一个合适的开发环境。本文将指导读者如何在 Eclipse 中搭建 JNI 开发环境,并使用 CDT ...

    android-JNI开发

    以下是对这个"android-JNI开发"主题的详细解释。 1. **JNI基础** - JNI接口提供了Java虚拟机(JVM)和本地代码之间的桥梁,使得开发者可以在Java应用程序中调用C/C++函数,反之亦然。 - JNI头文件`jni.h`包含了一...

    NDK JNI开发例子代码

    这个"NDK JNI开发例子代码"是一个实际的项目实例,帮助开发者了解如何在Android中使用NDK和JNI。通过参考提供的博客链接(http://blog.csdn.net/lm1391058/article/details/51221823),我们可以学习到以下关键知识...

    android studio jni开发 案例代码

    Android Studio JNI开发是Android应用程序开发中的一个重要组成部分,它允许开发者使用C++或其他本地语言编写部分代码,以实现高性能计算、利用硬件加速或者调用已有的C/C++库。JNI(Java Native Interface)是Java...

    基于java的开发源码-JNI代码生成器 JNIGen.zip

    基于java的开发源码-JNI代码生成器 JNIGen.zip 基于java的开发源码-JNI代码生成器 JNIGen.zip 基于java的开发源码-JNI代码生成器 JNIGen.zip 基于java的开发源码-JNI代码生成器 JNIGen.zip 基于java的开发源码-JNI...

    Android JNI 开发 步骤

    ### Android JNI开发步骤详解 #### 一、简介 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI主要用于调用C/C++编写的本地代码,这可以...

    Android下jni开发Demo

    本教程将深入探讨Android下的JNI开发,并通过一个实际的Demo来阐述相关知识点。 1. **JNI基础** - **JNI简介**:JNI是Java平台的一部分,它为Java开发者提供了一种方式,可以直接在Java代码中调用本地(非Java)...

    android_jni开发文档.rar

    周工的"android_jni开发文档"应该详细介绍了使用JNI进行Android开发的过程。 JNI开发流程主要包括以下几个步骤: 1. **创建本地方法接口**:在Java源代码中定义一个本地方法,使用`native`关键字标记。这个方法...

    jni开发demo

    在"JniDemo2"这个项目中,我们可以看到一个实际的JNI开发示例,包含了完整的源代码、资源文件和配置文件。通过研究这个示例,开发者可以更好地理解和掌握Android Studio中的JNI开发流程。记住,实践是检验真理的唯一...

    JNI开发步骤

    JNI 开发步骤详解 ...JNI 开发步骤包括环境搭建、编写 Java 本地代码、生成头文件、创建 JNI 项目结构、编写 Android.mk 文件、编写 native 代码和编译运行。通过遵循这七个步骤,可以成功地实现 JNI 开发。

    android JNI开发演示(串口收发)

    在这个"android JNI开发演示(串口收发)"项目中,我们将关注如何利用JNI实现Android设备上的串口通信。 串口通信是设备间数据传输的一种常见方式,常用于嵌入式系统和物联网应用。在Android平台上,由于操作系统对...

    Jni开发文档

    以下是对“Jni开发文档”中可能包含的知识点的详细解释: 1. **JNI概述**:JNI是Java与本地代码交互的标准接口,它定义了一套API,使得Java开发者可以编写本地方法,这些方法可以直接调用非Java代码,通常是C/C++。...

    Android 串口 JNI 代码

    在Android开发中,JNI(Java Native Interface)是一种技术,它允许Java代码和其他语言写的代码进行交互。JNI在Android系统中广泛用于实现性能优化、调用本地库或与硬件设备进行低级别通信,如本例中的串口通信。下面...

    java jni c++代码

    在Visual Studio 2010中开发JNI代码,你需要遵循以下步骤: 1. **创建项目**: 创建一个新的C++项目,选择适当的配置(如Win32 Console Application)。 2. **包含JNI头文件**: 在源代码中包含`jni.h`,这个头文件...

    JNI开发.rar

    本资源“JNI开发.rar”显然是关于如何进行JNI开发的教程或参考资料。 JNI开发主要包括以下几个核心知识点: 1. **JNI接口定义**:JNI提供了一系列的C/C++函数接口,这些接口在Java层通过`System.loadLibrary`加载...

Global site tag (gtag.js) - Google Analytics