Java JNI 使用笔记

Windows系统下LaTeX环境搭建与编辑器配置全攻略 本文详细介绍了在Windows系统下搭建LaTeX环境的完整流程,包括TeX Live的安装、TeXStudio编辑器的配置优化以及常见问题排查。特别针对中文用户推荐使用清华镜像源加速下载,并提供了XeLaTeX编译器配置、中文支持等实用技巧,帮助用户快速上手LaTeX文档编写。 阅读详情

简介

JNI 的全称是 Java Native Interface,是一种 Java 的 Native 编程接口,支持 Java 与 C/C++ 直接相互调用,从 JDK 1.0 开始提供。

基本使用流程

通过一个简单的例子来介绍下 JNI 的使用方法,对整体 JNI 有个初步的整体概念。

1. native method

定义一个 Java 类,其中包含 native 方法,另外通过 loadLibrary 来加载动态库。

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">package jni;

class JniDemo {
  static {
    // 这里是加载一个名叫 libjnidemo 的动态库,后缀会根据OS不同而不同
    System.loadLibrary("jnidemo");
  }

  public native void nativeMethod();
}

额外说明:

  1. 动态库需要在 java 启动参数的 -Djava.library.path= 中定义,否则会报动态库找不到的错误
  2. 对于苹果的 M1 电脑,需要额外注意动态库是属于那种架构(aarch64 和 x86_64),需要与使用的 jdk 保持一致

2. generate header

JDK 默认自动的工具可以生成头文件

<pre class="prettyprint hljs ruby" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;"># 1\. javac -h:java 编译为 class,并且生成头文件
${JAVA_HOME}/bin/javac -h . jni/JniDemo.java

# 2\. javah:需要在 classpath 下找到已经编译好的 class
${JAVA_HOME}/javah jni.JniDemo

生成的头文件示例如下:

<pre class="prettyprint hljs cpp" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">// filename: jni_JniDemo.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jni_JniDemo */

#ifndef _Included_jni_JniDemo
#define _Included_jni_JniDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     jni_JniDemo
 * Method:    nativeMethod
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_jni_JniDemo_nativeMethod
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

3. implementation

引入头文件,实现其对应的函数

<pre class="prettyprint hljs cpp" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">// filename: JniDemo.cc
#include "jni_JniDemo.h"

JNIEXPORT void JNICALL Java_jni_JniDemo_nativeMethod
  (JNIEnv *env, jobject obj) {
  printf("native method in jni\n");
}

4. compile

编译只需要依赖 jni.h 的头文件,还有一个与OS相关的头文件

这里编译的动态库的名字,与 Java 代码中的 System.loadLibrary 的动态库名字相关,额外多一个 lib 的前缀。

<pre class="prettyprint hljs ruby" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;"># for mac os
g++ -c -fPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/darwin JniDemo.cc -o JniDemo.o
g++ -shared -fPIC -o libjnidemo.dylib JniDemo.o -lc

# for linux
g++ -c -fPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux JniDemo.cc -o JniDemo.o
g++ -dynamiclib -o libjnidemo.so JniDemo.o -lc

5. run

执行的时候只需要指定 java.library.path,在这个路径下有 libjnidemo 动态库即可

<pre class="prettyprint hljs nginx" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;"># run
java -cp . -Djava.library.path=/path/to/libjnidemo jni.JniDemo

JNI Types

Primitive Types

Java 的 Primitive Types 与 JNI 中的 Native 多有对应的类型,都是以 j 开头。

这里在 Java 中定义 native 方法,其参数的类型都会被转换为对应的 native 类型。
Primitive Types and Native Equivalents

array 数组的基础类型是独立的类型,从这里就可以理解为什么说 Java 中的基础类型和基础类型的数组是两个类型,因为底层实现确实是两个。

比较特殊的是 String:有 jstring 的对应实现,但是其不属于 primitive type,属于 jobject,并且也没有单独的 array 实现。

jobject:

  • jclass (java.lang.Class objects)
  • jstring (java.lang.String objects)
  • jarray (arrays)
    • jobjectArray (object arrays)
    • jbooleanArray (boolean arrays)
    • jbyteArray (byte arrays)
    • jcharArray (char arrays)
    • jshortArray (short arrays)
    • jintArray (int arrays)
    • jlongArray (long arrays)
    • jfloatArray (float arrays)
    • jdoubleArray (double arrays)
  • jthrowable (java.lang.Throwable objects)

Java VM Type Signatures

Java 在底层实现来一套 Type Signatures,通过这套签名体系来表示 field 的类型、method 的签名、array 等。

在 JNI 获取 field 和 method 等处均需要使用 Type Signature。这里的 Type Signature 是 Java 单独定义的,需要根据下面的定义来使用。

Java VM Type Signatures 的表格如下:

这里简单举例说一下其使用方法,假设有一个 Java class 的定义如下:

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public class SimpleData {
  public boolean aBoolean;
  public String aString;
}

这个类在 jni 中读取其中的字段,就需要使用对应的 type signature,读取上述 class 的 field 方法如下:

<pre class="prettyprint hljs elixir" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">jclass kDummyDataClass = env->FindClass("LSimpleData;");

jfieldID data_aBoolean_ = env->GetFieldID(kDummyDataClass, "aBoolean", "Z");
jfieldID data_aString_ = env->GetFieldID(kDummyDataClass, "aString", "Ljava/lang/String;");

// 假设当前已经有 jobject dataObject,其对应的 java class 为 SimpleData
jboolean aBoolean = env->GetBooleanField(dataObject, data_aBoolean_);
// jstring 有单独的实现,但是其本质也是一个 jobject
jstring aString = (jstring) env->GetObjectField(dataObject, data_aString_);

CMake 编译

这里的编译方法可以参考 Arrow 的 c data api和 gandiva的编译。

下面是一个 CMake 的示例,通过 add_jar 来生成 jni 的头文件。

<pre class="prettyprint hljs cmake" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;"># Find java/jni
include(UseJava) # for add_jar

find_package(Java REQUIRED)
find_package(JNI REQUIRED)

# add_jar DESTINATION:生成的 java native method 的头文件位置
set(JNI_HEADERS_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")

# 设置 jni 的头文件
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
                    ${JNI_INCLUDE_DIRS} ${JNI_HEADERS_DIR})

add_jar(${PROJECT_NAME}
        src/main/java/jni/JniException.java
        src/main/java/jni/JniWrapper.java
        GENERATE_NATIVE_HEADERS
        hello_jni-native
        DESTINATION
        ${JNI_HEADERS_DIR})

set(SOURCES src/main/cpp/jni_wrapper.cc)
add_library(hello_jni SHARED ${SOURCES})
target_link_libraries(hello_jni ${JAVA_JVM_LIBRARY})

C/C++ API 差异

API 的差异主要是因为 C++ 支持 class(struct 与 class 的差异仅仅是可见性),C 只能用 struct + function pointer 来模拟。

jni.h 中,对 JNIEnv 的定义如下:

<pre class="prettyprint hljs cpp" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">#ifdef __cplusplus
typedef JNIEnv_ JNIEnv;
#else
typedef const struct JNINativeInterface_ *JNIEnv;
#endif

虽然同为 JNIEnv,但是其内部的实现是不同的,查看对应类即可知道 C/C++ API 的差异,这里以 GetStringUTFChars 为例举例说明其 API 的差异:

<pre class="prettyprint hljs rust" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">// c api
const char *str = (*env)->GetStringUTFChars(env, jstr, 0);

// c++ api
const char *str = env->GetStringUTFChars(jstr, 0);

方法的名字都是一样的,C/C++ API 下的函数是一样的,仅使用方法不同。

Arrow JNI

JNI 动态库的编译都是使用 CMake 来进行编译,JniLoader 用于加载动态库,JniWrapper 作为 native method 的类。

下面以 Arrow Gandiva 为例,简单分析下其 JNI 实现:

  1. 数据传输的方式为 JVM 堆外内存(从 Netty 申请的),向 JNI 传递数据 input 和 output 的时候使用 buffer address + length 的方式
  2. JVM 堆外内存本质是需要在 Java 侧进行内存的管理,所以在 JNI 中如果需要进行内存扩容(project 场景下,output 的内存可能需要扩容),会在 C++ 中调用 Java 的 VectorExpander 来进行扩容,保证内存全在 Java 中进行申请管理
一文读懂AI协同办公领域发展和趋势 协同办公,又称OA,是指企业内部或外部各类人员之间利用信息技术来进行协作工作的一种形式。这种协作工作既可以由直接员工进行,也可以来自外部的咨询机构、合作伙伴或联营企业。协同办公的优势在于可以对资源进行有效管理和配置,各部门之间可以建立良好的协作关系,跨部门更好地实现资源共享。 阅读详情

相关推荐

基于FSL的DTI数据预处理流程

最近在学习处理DTI数据,总结了一份应用FSL做DTI数据预处理的流程与大家交流交流。如果有错误的地方欢迎大家指正!        我用的数据是Philips的数据,如果是GE或者西门子的数据可能会有所不同。   原始数据:包括3DT1数据和高分辨率DTI数据,均是dicom格式。 工具:MRICRON和FSL,所有的命令均在Linux的终端中运行。   1.格式转换:将后缀名为dcm

zaza_zaza的博客 2万+

JNI 使用

JNI(Java Native Interface)是Java语言提供的一种机制,用于在Java应用程序中调用本地代码(Native Code)或者让本地代码调用Java代码。它为Java和其他编程语言(如C、C++)之间的交互提供了一种标准的接口。

DengCaixiang2021的博客 899

zynq+ad9361 petalinux使用官方IIO示波器调试记录

1ad9361 iio示波器

Yetob的博客 7991

Java Native Interface(JNI)从零开始详细教程

==================================================================================== 首先声明:这边文章是我翻译的文章(看了很多关于JNI的介绍,只有这篇个人认为最好,因此忍不住想要翻译给国内的各位),请勿随意转载,尊重文章原作者。 文章原始链接:https://www3.ntu.edu.sg/home/ehch

Android Fans 8万+

yanshee 机器人全流程指南

2.点击yanshee app右上角根据提示操作 3.当手机显示成功连接 ,按下机器人胸前按钮说出“ip地址”4.根据机器人播报的ip地址加上:8888使用浏览器访问,你就会看到 jupyterd的界面,里面可以新建文件也可以改他存在的文件。我们使了yanshee机器人,这个是面向K12、中高职、高校学生推出的开源人形机器人教育平台,应用于课程教学、竞赛、科研活动等场景。我们接下来可以根据这些apl做许多好玩的,比如控制他运动,跳舞唱歌,it`s easy。注意电脑,手机,机器人必须连同一个网。

qq_44827929的博客 7610

Win11系统下Notepad++右键菜单失效?3种修复方法实测有效(附注册表备份指南)

本文针对Windows 11系统中Notepad++右键菜单失效的常见问题,提供了三种经过实测有效的修复方法。核心解决方案包括使用官方NppShell.dll重新注册、手动修复注册表项以及系统级问题排查,并详细说明了操作前的注册表备份指南,确保修复过程安全可靠。

m2n3b4v5c6的博客 328

Java——本地方法(JNI)详解

1)、关于Load与LoadLibrary这里 System.load 方法需要读取 .dylib 的绝对路径,如果使用 System.loadLibrary 方法则需要传相对路径,这里建议大家写绝对路径,肯定不会出错。

吴声子夜歌的博客 2546

Debezium 性能调优实战:吞吐量、延迟与资源平衡

摘要: 本文分享了团队如何通过系统性调优将Debezium从初始3,200 TPS/2.8秒延迟提升至15,200 TPS/210ms延迟的实战经验。优化涵盖四个层面:1)Debezium连接器配置(批处理、快照并行、消息精简);2)Kafka分区策略与Avro序列化缓存;3)JVM改用ZGC及OS参数调优;4)MySQL的binlog与I/O优化。关键发现包括分区数黄金公式、sync_binlog调整带来56%的I/O负载下降,以及避免盲目增大队列内存等陷阱。最终实现吞吐量提升4.75倍,并强调性能调优需

爱丹丹的博客 357

Java调用c/c++(JNI)最详细步骤

非常详细的JNI入门,让java调用c/c++函数。避免了过程中间一些坑,不用四处去翻了。

m0_70722785的博客 8866

74、光谱成像在电子内窥镜及色彩理论中的应用

本文探讨了光谱成像在电子内窥镜中的应用及其与色彩理论的深度融合。通过分析FICE技术、色彩再现模型及胃黏膜光谱测量,展示了光谱信息在提升医学诊断准确性方面的潜力。同时,系统阐述了颜色的物理属性、标准表示方法、同色异谱现象、颜色测量技术(密度法与比色法)以及CIELAB等均匀颜色空间的构建原理。结合流程图与对比表格,梳理了从光信号获取到颜色处理的完整路径,并展望了人工智能与新型视觉模型在未来医疗成像与色彩科学中的发展方向。

g2h3i4j5的博客 152

【Agent从入门到实践】01 从“工具函数”到“智能体”:Agent与传统程序的核心区别

传统程序是“你教它怎么做,它才做什么”,Agent是“你告诉它做什么,它自己想怎么做”。从技术层面来说,这个区别的背后,是Agent融合了大语言模型(LLM)、记忆能力、工具调用能力、决策能力等技术,才实现了“自主思考”和“灵活执行”,而这些技术,咱们会在后面的章节中一步步拆解,手把手教大家实现。

人工智能AI技术 985

Java jni的使用 笔记

sda Java jni的基本使用 建立java项目 使用ide新建项目 找到对应的class文件,生成.h文件 打开命令行窗口,进入上图地址,在此地址输入下图命令。 红色框中是class文件的地址 使用Visual Studio生成dll文件 点击 文件——新建——项目 搜索c++选择动态链接库 需要下载如下工作负载否则搜不到动态链接库 将之前.class文件生成的.h文件以及jdk中jni.h以及jni_md.h放入工程目录下 并将其三个文件导入头部文件(头部文件右击——添加——现有项),如

weixin_45110628的博客 1499

PCB层叠结构与阻抗计算

1.Core 和 PP PCB两个重要组成部分:Core 和 Prepreg(半固态片,简称PP)。 如下图所示, Core 的两个表面都铺有铜箔,可作为信号层、电源层、地层等导电层,Core的上下表面之间填充的是固态材料; PP的表面不铺铜,在PCB中起填充作用,其材质是半固体的树脂材料,因此比Core略软一些。 在制作多层板时,需配合使用Core和PP,一般在两个Core 之间应选PP作为填...

sinat_15677011的博客 1万+

【Java学习笔记】什么是JNI

前言 在工作过程中,对接手的项目再次进行研究,发现其重要的一个组件JNI.这个东西说白了就是可以让c、c++语言交互。 什么是JNI JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始...

小七的博客 716

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java JNI的一个笔记

http://v.youku.com/v_show/id_XMjAyODY1NDUy.html 这个视频保证可以过。 首先得得安装JDK VC++ 视频上跟我使用的是是 2010 里面有点差别 不过不是很大的差别

小小小小方 647

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【随笔记】Java 调用 Jni 和 Jni 回调 Java 方法

Java 调用 Jni 和 Jni 回调 Java 方法。

lovemengx的博客 1064

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java笔记-JNI各种签名以及例子

目录 基本概念 栗子说明 基本概念 在JNI中有很多函数某些参数都要使用签名,如下: 其中的sig就是签名; 签名是一种用参数个数和类型区分同名方法的手段,即解决方法重载问题。 其中要特别注意的是: 1. 类描述符开头的'L'与结尾的';'必须要有; 2. 数组描述符,开头的'['必须有; 3. 方法描...

IT1995的博客 7516

JAVA学习笔记—JNI实现

参考资料-韦东山老师第四期视频 主要参考视频讲解和相关文档,进行java的一个小的学习总结。本文讲解JNI的实现原理和代码实验。 整体流程如下: 下面用代码来实现下,由于我这边使用的windows的电脑,所以采用虚拟机的方式,安装ubuntu(需要安装java,参考网上其他教程即可)进行操作。 先实现一个java程序和一个c程序(命名随意) JniDemo.java public class J...

业精于勤毁于嬉 376

java jni demo_Java JNI学习笔记

一 创建一个Java项目,名称JNIDemo 二 新建HelloWorld.java 三 在dos下进入项目的bin文件夹下,使用javah命令编译HelloWorld.class文件javah com.demo.jnidemo.HelloWorld编译后会生成一个头文件 com_demo_jnidemo_HelloWorld.h四 用VisualStudio创建一个win32控制台应用项目,应用...

weixin_26516841的博客 218

JNI开发笔记(八)--Java读取txt文件进行JNI测试

Java读取txt文件进行JNI测试引前言1. 新建assets文件夹2. 载入测试文件3. 建立文件读取方法4. 在MainActivity中读取文件数据 引 JNI开发笔记(一)–Android Studio安装与环境搭建 JNI开发笔记(二)–创建JNI基础工程并运行 JNI开发笔记(三)–JNI工程的框架分析 JNI开发笔记(四)–实现一个简单的JNI工程并生成so库 JNI开发笔记(五)–JNI语法总结 JNI开发笔记(六)–一种更规范的so库生成方法 JNI开发笔记(七)–aar库的生成和调用

魔法师の屋子★↓☆ 4915

java学习笔记——JNI

android 内核是linux,而内核和c库是用c语言写的。上层android是用java写的,如何调用c库中的函数?这个调用的机制或者协议即为JNI。 java如何调用c库的函数: 1、加载c库 2、找到对应的函数 3、调用函数 其中,2步骤,采用的是映射。同样需要指定库目录的环境变量 具体映射过程,现在暂不了解,需要详细阅读文档后再补充,感觉和驱动的注册过程很相像。 4、参数传...

qq_42067893的博客 183

Java笔记-JNI的基本使用(Java调用C++的dll)

目录 基本概念 过程演示 基本概念 JNI(Java Native Interface),这个是Java本地接口,可以调用Windows上的dll或者Linux上的so文件,当然要按照他的规范进行编写。感觉这个和Qt写Android程序的逻辑差不多,为什么这么说呢? 在Java目录下,有专门生成动态链接库的.h文件。通过包含这些文件使得Java能够调用dll。 而Qt在下载...

IT1995的博客 6156

Linux上c++通过JNI调用java代码笔记

2 最近工作中,需要用到c++通过JNI去访问Java代码,在这里做下自己过程中遇到的问题,做个总结; 1.linux配置java jdk环境 第一步:去官网下载对应的linux包 https://www.oracle.com/java/technologies/javase-jdk11-downloads.html (这里我用的jdk11) 第二步:解压放在/usr/lib/下面 第三步:配置环境(/etc/profile) export JAVA_HOME=/usr/lib/jd...

Tjmies的博客 984

Java枚举和C枚举的转换——JNI笔记

前言 最近在做中间件相关,遇到一个JAVA和C之间枚举值通过JNI传递的问题。我们知道C语言的枚举型是一个集合,其每个枚举成员是一个整型常量;而JAVA的枚举其本质是一个类,继承自Enum类,每个枚举成员是枚举类型常量。他们之间是不同的两种数据类型,不能直接进行转换。Java枚举和C枚举的转换本质是Java枚举类型和int整型的转换。 两种枚举的特点 新创建的枚...

Zhou2828的博客 4503

java jni框架,Java JNI 简明教程(一)——传智播客JNI笔记(王泽佑)

package cn.itcast;public calss TestNative {public native void sayHello();public static void main(String[] arg){}}```2. 用javah.exe生成包含native方法的C/C++头文件javah -jni(默认)javah cn.itcast.TestNative //由类名执行生成...

weixin_42395776的博客 233

Java JNI学习笔记

JNI概述JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。在java源码中,我们可以发现大量源码都是利用native方法来实现了。 当一个类被使用时,这个类的字节码就会加载到内存,这些字节码的入口就维持着这个类的一

hugua专栏 378
上一篇: Java对象的实例化过程是怎样的?
下一篇: Spring Security 自定义资源服务器实践
Java_ttcd
博客等级 码龄4年 198粉丝 190原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值