美文网首页音视频
Java与JNI层通信

Java与JNI层通信

作者: gczxbb | 来源:发表于2019-06-02 00:08 被阅读29次

javah命令生成的h文件中,每一个native方法的参数都包含JNIEnv *指针类型和jobject类型,当native方法无参数时,h文件自动生成的声明中将只有这两个参数。

JNIEXPORT jstring JNICALL Java_com_jni_app_JniCls_nativeGetStrFromJNI
  (JNIEnv *, jobject);

JNIEnv类型,代表Java环境,该类提供了一些方法,可以操作Java层代码。
jobject类型,代表Java层调用native方法类的对象实例。若是静态native方法,代表Java层调用native方法类的Class实例。
jclass类型,代表Java中某个类的Class对象。

JNI的类型

类型名称 Java层对应
jint int
jlong long
jbyte byte
jboolean boolean
jchar char
jshort short
jfloat float
jdouble double
jobject Object

JNIEnv方法

GetObjectClass方法,查找Java层对象的Class类实例。
GetMethodID,查找Java层方法。。
CallXxxMethod,调用Java层的方法,Xxx代表返回返回的类型。
NewObject,创建Java类的对象。
GetXxxField,获取Java类中类型是Xxx的字段的值。
SetXxxField,获取Java类中类型是Xxx的字段值。

查找Java层对象的Class类实例。

jclass      (*GetObjectClass)(JNIEnv*, jobject);

根据方法名,查找Java层中类Class中的方法。

jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)

调用Java层的方法。jmethodID根据GetMethodID方法获取。每一种类型都包含三个方法。

jobject     (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);
jobject     (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);
jobject     (*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
jboolean    (*CallBooleanMethod)(JNIEnv*, jobject, jmethodID, ...);
jboolean    (*CallBooleanMethodV)(JNIEnv*, jobject, jmethodID, va_list);
jboolean    (*CallBooleanMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
...

可变参数,jvalue是一个union联合体,根据赋值可以定义成任何种类型。

Jave层字符串和jstring


任重而道远

相关文章

  • Java与JNI层通信

    javah命令生成的h文件中,每一个native方法的参数都包含JNIEnv *指针类型和jobject类型,当n...

  • NDK--JNI开发

    使用JNI与Native code通信 什么事JNI? JNI是Java native interface的缩写,...

  • JNI 原理

    我们都知道JNI结构是 Java 层 -> JNI -> Native 层, 以此实现Java 层和Native层...

  • Android JNI之加载第三方so库

    JNI全称是Java Native Interface,为Java本地接口,是连接Java层与Native层的桥梁...

  • JNI开发系列②.h头文件分析

    接续上篇JNI开发系列①JNI概念及开发流程 前情提要 JNI技术 , 是java世界与C/C++世界的通信基础 ...

  • Android Framework层的JNI机制(二)

    Java框架层中有很多地方使用JNI机制,每一个部分的框架层代码,都可能有与之对应的JNI库。先了解Java框架层...

  • JNI 常见用法

    一、Java 代码 和JNI代码通信 Java代码通过JNI接口 调用 C/C++方法 1、首先我们需要在Java...

  • jni

    jni函数的注册:java层的native函数是怎么和jni层函数关联的; 1.静态注册:java层的具有nati...

  • 插件化中加载so库解决方案

    简介 先简单介绍下,我们知道jni是native层与java层交互的桥梁,有了jni,我们可以通过动态或静态的方式...

  • Android JNI 开发

    一、JNI 与 Android JNI 是 Java 提供的用于在跨平台系统中,与系统本地代码进行交互的一层应用程...

网友评论

    本文标题:Java与JNI层通信

    本文链接:https://www.haomeiwen.com/subject/kafztctx.html