[转]JNI入门介绍

多GPU时代的虚拟内存革命:CUDA VMM API的跨设备协同设计哲学 本文深入探讨了NVIDIA CUDA VMM API在多GPU系统中的虚拟内存管理革命,解决了传统Peer Access的显存碎片化和同步开销问题。通过地址-内存解耦、按需映射和精细权限控制,VMM API为分布式训练提供了高效的内存协同方案,显著提升大模型训练性能。 阅读详情

 

 

JNI入门介绍

 

1.简介
JNI是Java Native Interface的缩写,它的设计目的是:
The standard Java class library may not support the platform-dependent features needed by your application.
You may already have a library or application written in another programming language and you wish to make it accessible to Java applications
You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call these functions
2.JNI的书写步骤 
编写带有native声明的方法的java类
使用javac命令编译所编写的java类
使用javah ?jni java类名生成扩展名为h的头文件
使用C/C++实现本地方法
将C/C++编写的文件生成动态连接库
1) 编写java程序: 
这里以HelloWorld为例。
代码1:
class HelloWorld {
public native void displayHelloWorld(); 
static {
System.loadLibrary("hello");
} 
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明改方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述。
Load动态库:System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方法displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();的参数“hello”是动态库的名字。
main()方法
2) 编译没有什么好说的了
javac HelloWorld.java
3) 生成扩展名为h的头文件
javah ?jni HelloWorld
头文件的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:   HelloWorld
* Method:  displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
(这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致)。
4) 编写本地方法
实现和由javah命令生成的头文件里面声明的方法名相同的方法。
代码2:
1 #include <jni.h>
2 #include "HelloWorld.h"
3 #include <stdio.h>
4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!/n");
return;
}
注意代码2中的第1行,需要将jni.h(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入,因为在程序中的JNIEnv、jobject等类型都是在该头文件中定义的;另外在第2行需要将HelloWorld.h头文件引入(我是这么理解的:相当于我们在编写java程序的时候,实现一个接口的话需要声明才可以,这里就是将HelloWorld.h头文件里面声明的方法加以实现。当然不一定是这样)。然后保存为HelloWorldImpl.c就ok了。
5) 生成动态库
这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImpl.c文件夹下面,使用VC的编译器cl成。
cl -I%java_home%/include -I%java_home%/include/win32 -LD HelloWorldImp.c -Fehello.dll
注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%/include -I%java_home%/include/win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。
6) 运行程序
java HelloWorld就ok

转自:http://java.chinaitlab.com/JDK/36677.html

 

事件相机(Event Camera)及相关研究简介——新一代相机?新的计算机视觉领域? 事件相机(Event Camera)及相关研究简介 事件相机是一个新型的类脑相机,是一个待开发的大领域。希望通过我的分享,能够有更多人来研究并将它更好地运用在我们的生活中~ 阅读详情

相关推荐

Autosar诊断实战系列05-Dcm之0x27加解密服务配置开发详解

UDS 0x27服务实战开发介绍,对解锁尝试次数及delay时间进一步解释。

initiallizer的博客 1942

JNI入门介绍

1.简介    JNIJava Native Interface的缩写,它的设计目的是:    The standard Java class library may not support the platform-dependent features needed by your application.    You may already have a library or applic

Darren的专栏 960

RandLA-Net Tensorrt 推理 c++

RandLA-Net 实现 Tensorrt 部署.

J。 1092

Android JNI 技术入门指南

JNIJava 与其他编程语言(通常是 C 或 C++)之间的接口,允许 Java 代码与底层的本地代码进行交互。通过 JNI,我们可以在 Java 代码中调用本地(native)方法,或者让本地代码调用 Java 方法。之前一直对JNI望而却步,真正学过后回头看看,也不是那么的难,难的是你不主动去学。所有伟大,都源于一个勇敢的开始!共勉!

WriteBug001的博客 2059

NDK 入门(三)—— JNI 注册与 JNI 线程

在 Native 方法中把 JNIEnv 和 jobject 封装在 MyContext 中,然后把 MyContext 传入 pthread_create() 的第四个参数,在 线程的入口方法 task 中接收 MyContext 使用两个封装的参数回调上层方法。默认的注册方式就是静态注册,上面提到的模板方法 stringFromJNI() 就是通过静态注册生成的 JNI 函数 Java_com_jni_register_MainActivity_stringFromJNI()。

tmacfrank 2127

JNI/NDK入门指南之JNI访问数组

        JNI/NDK入门指南之JNI访问数组   在前面的章节JNI/NDK入门指南之JNI字符串处理中讲解了JNI对字符串的处理流程。今天我们继续向JNI的知识海洋进军讲解JNI对数组的处理。本章内容有点多哦! 前言 JNI 中的数组分为基本类型数组和对象数组,它们的处理方式是不一样的,基本类型数组中的所有元素都是 JNI的基本数据类型,可以直接访问。而对象数组中的所有元素...

IT先森 4571

JNI快速入门

JNI快速入门 JNIJava Native Interface 即Java本地接口,使用此种机制可以实现Java和C/C++互相调用.本文对该机制进行快速入门, 并记录了我在整个过程中遇到的问题及解决方法。 Java调用C++代码 Java调用C++代码本质上是对C++生成的动态库进行调用而不是直接对C/C++代码进行调用。 第一步:设计Java端接口; public

Dony的专栏 3347

Android JNI 基础入门指南

Android JNI 基础入门指南

ljy545733599的博客 1706

Android Jni介绍和简单Demo实现

JNI 全程:JNI(Java Native Interface),通俗翻译:Java本地方法官方说法:提供一种Java字节码调用C/C++的解决方案,JNI描述的是一种技术。所以这里的Nativie的本地的意思就是C/C++,所以JNI通俗理解就是Java调用C/C++的方案技术。//定义变量和方法private:int number;public://定义方法。

wenzhi的博客 3211

JNI技术简单介绍

JNIJava Native Interface的缩写,中文译为“Java本地接口”。Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数。Native程序中的函数可以调用Java层的函数,也就是说在C/C++程序中可以调用Java的函数。也就是Java与C/C++代码互相调用在平台无关的Java中,为什么要创建一个与Native相关的JNI技术呢?这岂不是破坏了Java的平台无关特性吗?

ztisen的博客 1920

NDK 入门(一)—— JNI 初探

宏是预处理器的一个重要概念,它是一种简单的文本替换机制。宏定义使用#define关键字,将一个标识符与一个文本片段关联起来。当源代码中出现宏标识符时,预处理器会将其替换为与之关联的文本片段。以下是一些常见的宏使用示例:// 定义 PI 为常量#define PI3.14159// 定义 PI 为常量 # define PI 3.14159 // 定义 MAX(a, b) 为宏函数 # define MAX(a , b)((a) >(b)?(a) :(b))

tmacfrank 1531

JNI/NDK入门指南之JNI异常处理

          JNI/NDK入门指南之JNI异常处理   任何人都犯错误,连我们的好人强东哥都是如此,当然我们程序员也在这个行列之内了,哈哈(不是各位读者想象的那个错啊)。在Java ...

IT先森 2884

JNI/NDK入门指南之正确姿势了解JNI和NDK

         你真的了解Android中JNI/NDK吗?    随着Android生态的发展,越来越多的行业开始使用Android操作系统,这就造就了对Android设备的应用性能和安全要求越来越高,随之而来的对JNI/NDK开发的需求也越来越大。虽然网上或者很多书籍都有关于此方面的讲解,但是都是上来直奔主题说怎么使用JNI/NDK,而没有将啥是JNI和NDK讲解清楚。所以导致很...

IT先森 3556

JNI开发入门

一、概述 这篇文章用于记录JNI开发入门第一步,通过AS进行编写JNI代码,并生成so库文件。 二、NDK环境搭建 AS中下载NDK 创建一个jni项目 AS会帮我们创建两个文件 三、编写JNI代码 打开CMakeLists.txt文件,可以看到生成so库的名称和连接的cpp文件等。 # For more information about using CMake with Android Studio, read the # documentation: https://d.android.com/

weixin_42046829的博客 2657

JNI介绍

1 JNI定义 JNI(Java Native Interface),即Java本地接口,JNIJava调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互. 以下是oracle对JNI的定义 JavaTM Native Interface (JNI) is a standard programming interface for writing Java nativ...

yizhongliu的专栏 617

JNI/NDK入门指南之JNI字符串处理

       JNI/NDK开发指南之JNI字符串处理   在前面的章节JNI/NDK开发指南之JNI数据类型,描述符详解中我们了解了JNI能处理的基本类型,细心的读者会发现这其中不包括字符串。那么今天我们要重点讲解的就是JNI中对字符串的处理了。 ...

IT先森 3196

Android Studio JNI开发入门教程

概述 在Andorid Studio不支持JNI开发之前大家一般都是使用Eclipse开发JNI,各种配置让人觉得很蛋疼。从Andorid Studio支持JNI开发后,让我们开发JNI变的如此简单。下面我就介绍一下Android Studio开发JNI的全过程,如有不对的地方大家批评指正。 你将学习到什么 什么是NDK和JNI为什么要用JNI做开发如何使用Android Studio开

easyer2012的专栏 1万+

JNI/NDK入门指南之jobject和jclass

      JNI/NDK开发指南之jobject和jclass   在前面的章节JNI/NDK开发指南之JavaVM和JNIEnv中,我们详细介绍了一番JavaVM和JNIEnv,那么今天的篇章里面分别介绍一番jobject和jclass两个概念。 细说jobject和jclassJNI开发中JNI,实例引用(jobject)和类引用(jclass)让人觉得很困惑,至少我刚开始学习的时候...

IT先森 5410

JNI入门介绍(Android Studio 3.4)

最近入手安卓的开发与学习,就迫不及待的下载了最新版的AS3.4。可是当我开发JNI程序时,却发现网上的方法大多已经过时,所以在此更新一波以做备忘。 环境:Win10 X86 64位 Android Studio 3.4稳定版 ...

黑白棋的博客 7797

JNI/NDK入门指南之JNI数据类型,描述符详解

            JNI数据类型,描述符详解    通过前面的章节正确姿势了解Android中JNI/NDK,我想读者朋友们一定对JNI/NDK的基本概念印象深刻了吗,那么接下来就要开始我们的JNI编程学习了。学编程的东西,一般法则先学习它的最基础数据类型,同理JNI也是如此。既然JNI是用来C/C++和Java通信的,那么JNI为之定义了一系列基本数据类型和引用数据类型用来与Java交...

IT先森 3551

JNI/NDK入门指南之JNI动/静态注册全分析

      JNI/NDK开发指南之JNI动/静态注册全分析   在前面的章节里面我们主要讲解了JNI开发中的一些基本语法知识,并且在JNI/NDK开发指南之Eclipse集成NDK开发环境并使用中简单通过一个实例说明了NDK开发JNI流程。那么读者朋友们,是否有过这么一个疑问JNI中的虚拟机怎么知道我们使用Java中的Native方法时,具体调用到JNI Native中的那个函数呢。这个就是本篇...

IT先森 2004
上一篇: Java程序通过JDBC获取数据库及其数据表信息
下一篇: SVN使用过程记录(一)
mxbin2008
博客等级 码龄19年 16粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值