不同编译环境JNI使用

通义万相Wan2.1模型Lora训练以及推理 使用DiffSynth-Studio进行通义万象Wan2.1的Lora训练和推理 阅读详情

 

JNI(java调用dll)--DOS环境下和MyEclipse两种环境下

JAVA 2010-06-24 18:00:46 阅读423 评论0  字号:大中小 订阅

调用带非字符类型,如整型(int),可参照下列,如为字符或字符串,阅读全文。

DOS环境下:

Java文件准备:

HelloNative.java

public class HelloNative {

public native static void greeting();

static

{

System.loadLibrary("HelloNative");

}

}

这个文件建好以后,先启动一个DOS窗口,按照下面步骤执行(注意,执行下面步骤,必须保证与Java源文件在同一目录下):

  1.  
    1. 编译:javac HelloNative .java  //生成HelloNative.class
    2. 生成DLL函数所需头文件(HelloNative.h):javah -jni HelloNative

HelloNative.h内容:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */

#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloNative
 * Method:    greeting
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloNative_greeting
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

测试文件:

HelloNativeTest.java

class HelloNativeTest
{  

public static void main(String[] args)

{  

new HelloNative().greeting(); 

}

}

编译生成执行类文件。

 

创建DLL:

启动VC6.0,按以下步骤执行:

新建工程:File  --->   New    --->   Projects   --->   Win32 Dynamic-Link Library      然后输入新建工程名称,最好是保持与要建的DLL

名字一样(这是第一次做,小心为上,随便起名,与DLL不同不知道会不会有问题,改天再试),然后选择  OK  ,出现下

一个选择面板,选择  An empty dll project.  ,然后直接点   Finish   ,工程新建完毕。

环境准备:找到Java的安装目录下的 include目录(路径参照 D:/Program Files/Java/jdk1.6.0_20/include/ )将这个目录下的全部文件复制到VC6.0的安装目录下的 include目录下(路径参照 D:/Program Files/Microsoft Visual Studio/VC98/Include/ ),然后将D:/Program Files/Java/jdk1.6.0_20/include/ win32下的内容再复制到D:/Program Files/Microsoft Visual Studio/VC98/Include/下(这里出现了双份的jawt_md.h和jni_md.h拷贝,编译的事情,这里不具体研究,出问题再说),这些完成后,把Java代码准备时生成的DLL头文件 HelloNative.h 添加到上一步新建的DLL工程中,然后再新建一个DLL程序文件 HelloNative.c

HelloNative.c

#include "HelloNative.h"

#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloNative_greeting(JNIEnv* env, jclass cl)

{  

 printf("Hello Native World!/n");

}

新建完成后,执行 Build  --->  Build  HelloNative.dll (或者按F7) 生成测试用的DLL文件

然后将DLL文件拷贝到测试用Java程序的执行类(*.class)所在文件下,这个练习是放到HelloNative.class和HelloNativeTest.class所在目录下,然后进入DOS窗口,执行 java HelloNativeTest(回车),就可以看到输出结果了。

 


 


如果是在MyEclipse工程中,需要进行下述操作:

将VC工程生成的DLL文件放到工程 bin目录下,这个练习是将 HelloNative.dll 放到 bin 目录下。

找到菜单  Run   --->   Open Run Dialog...   --->  Java Application(选项卡)    ,在这个选项下边,会有对应于要调用DLL工程的一个选项,点进这个选项,在详细设定面板中选择   (x)=Arguments 这个选项卡,在里有一个文本输入的项目叫 VM arguments  ,在里面输入       " -Djava.library.path=E:/JavaWork/nativeInterfaceCall/bin"      ,然后点  Run 按钮,然后就可以执行程序了。

 

注意,这里的" -Djava.library.path=E:/JavaWork/nativeInterfaceCall/bin",不能在程序中用System.Setproperty()设定,因为java.library.path这个属性只在JVM启动的时候读取一次,所以,程序中的任何相关设定都是不起作用的。

HelloNative.java 这种中间类不能放在包里面,就是不能指定package。

 

调用带字符串参数的DLL
带字符串参数的DLL调用必须借助每三方接口,确切的说,就是在要调用的DLL上再加一层接口,下述说明参照。

上述使用例程修正如下:

HelloNative.java

public class HelloNative {

//这里对应的DLL接口定义为void greeting(char *str),这么定义是因为Java和C使用的是不同的字符集标准

//C是ANSI,Java是UTF-16(这个我也是查资料,没弄的太明白,可能有误,不过基本是这么个意思)

public native static void greeting(byte[] str,int strLength);

 static

 {

 System.loadLibrary("HelloNative");

 }

}

参照无参的HelloNative.java的说明,生成HelloNative.h头文件。

HelloNativeTest.java

class HelloNativeTest
{  
   public static void main(String[] args)
   {  
   String str = new String("Hello Native World!/n");
      new HelloNative().greeting(str.getBytes(),str.length());
   }
}

参照无参例子,新建动态链接库工程,生成DLL文件,然后将DLL放到system32下,放到别的地方也可以,不过要将你放的路径设置到系统环境变量 path 里,这样就不用运行Java的时候,总是去设定 java.library.path 这个JVM属性了。到这里,生成的是可以供windows调用的DLL。下面是参照代码:

 

如果是编译位于包路径下的中间件接口,使用如下格式命令

生成类文件:javac xxx.java

生成编译DLL所需头文件:javah -jni -classspath 包路径。类名(com.XXX.util.xxx)

 

转自:

http://51170526.blog.163.com/blog/static/73633350201052452742369/

 

Word公式批量转MathType终极指南:解决omml2mml.xsl缺失与格式调整难题 本文提供Word公式批量转MathType的终极解决方案,重点解决常见的omml2mml.xsl文件缺失问题,并详细讲解批量转换与格式调整技巧。通过补全文件路径、分批次转换及样式预设等方法,大幅提升学术论文公式编辑效率,适用于Office 2016及以上版本。 阅读详情

相关推荐

告别Keil/IAR:在VSCode中用CMake+Clangd打造丝滑的STM32开发环境(附完整配置)

本文详细介绍了如何在VSCode中使用CMake和Clangd搭建高效的STM32开发环境,替代传统的Keil/IAR工具。通过完整的配置指南和快速开发技巧,帮助开发者实现轻量级、高度可定制的现代化开发流程,显著提升STM32项目的开发效率。

weixin_26843605的博客 164

getenv JNI library not found. Env.getenv will not work error

前几天在使用tinyos自带的java串口接收数据程序的时候出现了标题这个错误。2天之后终于解决,现在记录如下,为其他碰到类似问题的朋友们做个参考。$java net.tinyos.tools PrintfClient -comm serial@COM4:telosb会得到一个error: getenv JNI library not found. Env.getenv will

1586

KDD 2025 | 人大团队提出多任务贝叶斯联邦学习算法,同时处理分类和回归

©PaperWeekly 原创 ·作者 |吕俊良单位 |中国人民大学统计学院本文介绍了中国人民大学统计学院的一篇关于多任务贝叶斯联邦学习的文章“Task Diversity in Bayesian Federated Learning: Simultaneous Processing of Classification and Regression”,本文被 KDD 2025 接收,代码已经...

Paper weekly 2746

编译JNI的动态库, 遇到的坑

一.前言 最近工作中,需要编译JNI的动态库.这个动态库,要被Java调用. JNI的定义,在维基百科[1]中这样介绍: 当你遇到一些情况, 不能完全使用Java语言完成开发的时候, JNI允许程序员编写native methods去解决问题. 很多特定的平台特征和标准库都是基于JNI开发的(PS:图像处理领域,很多都是C/C++开发的库,例如opencv). Java程序通过JNI

奋斗,永不止步 8571

从RJPG到温度地图:基于大疆TSDK的热红外数据精准处理与Pix4D拼接实战

本文详细解析了如何利用大疆TSDK将无人机拍摄的热红外RJPG图像精准转换为带有地理坐标的温度TIFF文件,并完成Pix4D拼接生成正射温度地图的全流程。文章重点阐述了辐射定标的原理、TSDK关键参数(测量距离、湿度、发射率、反射温度)的设置与微调方法,以及Pix4D处理中的常见报错解决方案,旨在帮助用户实现从原始数据到可分析温度地图的精准处理。

docker7nomad的博客 464

【数学建模】编程手学习路线

在学习过程中,建议注重理论与实践相结合,多进行实例练习和项目实践,以巩固所学知识并提升实际应用能力。同时,保持对新技术和新方法的关注和学习,不断提升自己的专业素养和竞争力。NumPy、Pandas、Matplotlib和Seaborn等库是数据处理和可视化的重要工具。掌握常用机器学习算法的原理和应用,如决策树、支持向量机、神经网络等。学习内容包括微积分、线性方程组、矩阵运算、概率分布、统计推断等。学习内容包括基本语法、函数和模块、面向对象编程、文件操作等。深入了解优化理论和方法,如梯度下降法、牛顿法等。

2301_79586491的博客 2960

JNative library not loaded

Exception in thread "main" java.lang.IllegalStateException: JNative library not loaded, sorry !     at org.xvolks.jnative.JNative.&lt;init&gt;(JNative.java:337)     at org.xvolks.jnative.JNative.&lt;i...

net_building的专栏 3115

数据包络分析(超效率-SBM模型)附python代码

超效率-SBM模型超效率SBMpython代码(部分) 这段时间差不多忙完了,终于有时间可以来经营我的博客了。 上阵子挺多人私信我,原谅我记性不好,可能没有回复全。 这篇文章是超效率的扩展。 超效率SBM SBM本身就是非径向模型(non-radial model),想要了解径向超效率的请自行去前面翻阅。 上篇文章说到super-SBM的一个模型,公式为: 这个模型是分式模型,我们可以通过charnes cooper变换,将其转变成为: python代码(部分) 在编程过程中,本来我以为第一个模型是无

weixin_43217288的博客 3万+

基于Ubuntu下的JNI的简单DEMO实现与error解决

所需环境 1. Ubuntu 系统 (本文系统 16.04 LTS) 2. JDK (请自行安装) JNI定义: JNI是Java Native Interface的缩写,通过使用Java本地接口书写程序,可以确保代码在不同的平台上方便移植。 (个人理解:很多底层功能或者硬件及驱动方面的功能是C/C++ 完成的, 想要和这些程序打交道的媒介就是JN...

moomwu的博客 278

ArcGIS Pro 3.0 加载天地图WMTS服务,解决偏移问题的保姆级教程(附最新Key申请流程)

本文详细介绍了在ArcGIS Pro 3.0中精准加载天地图WMTS服务的全流程,包括最新Key申请流程、解决地图偏移问题的关键配置步骤以及常见问题排查方法。通过设置`esri`参数和统一坐标参考,确保地理数据与天地图底图精确匹配,提升GIS空间分析的准确性。

weixin_28713947的博客 302

PyTorch 面试题及参考答案(精选100道)

模块是 PyTorch 中用于自动求导的核心模块。它为张量上的所有操作提供了自动求导的功能。在深度学习中,反向传播是一种用于计算损失函数相对于模型参数的梯度的算法。通过梯度,我们可以使用优化算法(如随机梯度下降)来更新模型的参数,从而最小化损失函数。模块的主要作用就是自动计算这些梯度。当我们创建一个张量时,如果将其属性设置为True,那么 PyTorch 会跟踪该张量上的所有操作。在完成前向传播计算出损失函数后,调用方法,模块会自动根据链式法则反向传播计算出所有需要求导的张量的梯度。

大模型大数据攻城狮的专栏 1680

jni.h头文件详解(二)

GetVersion ,DefineClass , FindClass, FromReflectedMethod, FromReflectedField ,ToReflectedMethod, ToReflectedField) 函数的介绍和如何使用这些函数的样例介绍.

shaohuazuo的专栏 9963

YOLOv8改进策略【Neck】| CGA Fusion:内容引导的注意力融合模块,空间权重引导的多模态特征自适应融合

本文记录的是利用CGA Fusion 模块改进 YOLOv8 的多模态融合部分。(Content-Guided Attention Fusion)通过内容引导注意力生成空间权重,引导高低层特征的自适应融合。本文利用模块,通过内容引导注意力生成空间权重,自适应地融合两个模态的特征,在特征融合阶段实现跨模态语义对齐与噪声抑制,增强对不同模态互补特征的利用能力,从而提升模型在多模态场景下的检测鲁棒性与准确性。DEA-Net: Single image dehazing based on detail-enhanc

Limiiiing的博客 281

谈谈android中的jni编程的相关步骤

首先说明,Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须是通过Java代码嵌入Native C/C++——即通过JNI的方式来使用本地(Native)代码。因此JNI对Android底层开发人员非常重要。 如何将.so文件打包到.APK 让我们 先 从最简单的情况开始,假如已有一个JNI实现——libxxx.so文件,那么如何在APK中使用它呢?

jys1115的专栏 609

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

(转)Android中JNI编程的那些事儿

Android中JNI编程的那些事儿首先说明,Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须是通过Java代码嵌入Native C/C++——即通过JNI的方式来使用本地(Native)代码。因此JNI对Android底层开发人员非常重要。如何将.so文件打包到.APK让我们 先 从最简单的情况开始,假如已有一个JNI实现——libxxx.so文件,那么如何在APK中使用它呢...

weixin_33850015的博客 88

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android中JNI编程的那些事儿 【转】

后续可能为需要加入一些特定的模块到android中,所以JNI还需继续熟悉起来 本文转自:http://www.cnblogs.com/MarsGG/articles/2057433.html        首先说明,Android系统不允许一个纯粹使用C/C++的程序

lightsoure的专栏 1016

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android中JNI编程的那些事儿

JNI译为Java本地接口。它允许Java代码和其他语言编写的代码进行交互。在android中提供JNI的方式,让Java程序可以调用C语言程序。android中很多Java类都具有native接口,这些接口由本地实现,然后注册到系统中。       Android系统不

androidboy365的专栏 744

Android中JNI编程详解

Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须是通过Java代码嵌入Native C/C++——即通过JNI的方式来使用本地(Native)代码。因此JNI对Android底层开发人员非常重要。 如何将.so文件打包到.APK 让我们 先 从最简单的情况开始,假如已有一个JNI实现——libxxx.so文件,那么如何在APK中使用它呢? 在我最初写类似程序的

believe的专栏 1619

JNI使用技巧点滴(二)

作者:normalnotebook 背景上一讲我们介绍了JNI的基本概念和基本用法。现在介绍复杂一点的例子,用JNI调用其他工具生成的DLL,实现某个特定的功能。在这里我们将用VC编写一个DLL,供JAVA调用。 VC编写简单DLL这个DLL实现一个简单的字符串传递,然后弹出一个消息框,显示所传递的字符串,同时将所传递的字符串变成小写,返回给JAVA程序。即JAVA程序和VC编写的

极光 1976

使用C语言通过openssl编写JNI的加解密库适配各个平台的方案

使用musl-gcc的编译器执行编译,生成只依赖libc.so的musl的库,可在基于glibc的各类linux环境(Ubuntu、CentOS等)中使用,也可在基于musl的alpine轻量级linux(docker轻量级镜像)中使用。指定了基于musl的libc.so与目标库在同一目录下,JDK在加载目标库时会自动加载同级目录下的libc.so库,至此动态库保持独立,不与系统的glibc关系,可适配同架构下的不同版本的linux。

jaco 779

五、jni配置

apply plugin: 'com.android.application' android { compileSdkVersion 26 buildToolsVersion '26.0.2' defaultConfig { applicationId "com.ywj.demojni" minSdkVersion 16 ...

蓝色的天空的博客 307

java jni 编程

最近要学习Java JNI 编程. 我使用的是的windows系统。装了一个cygwin. 根据 《JNI 编程规范和指南》. 文件网址: http://wenku.baidu.com/view/b52878ffaef8941ea76e0531.html  第一步: javac  HelloWorld.java 生成了 HellWorld.class    // 在cygwin 下执行命令 ...

weixin_33806300的博客 76

Android Native 代码NDK开发学习笔记

引用:http://www.kunli.info/2011/08/21/android-native-code-study-note/ JNI,全称Java Native Interface,是用于让运行在JVM中的Java代码和运行在JVM外的Native代码(主要是C或者C++)沟通的桥梁。代码编写者即可以使用JNI从Java的程序中调用Native代码,又可以从Native程序中调用J...

weixin_30307267的博客 100

VS2010 通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!

参考了Himi的博客:http://www.himigame.com/android-game/725.html,总结一下在VS2010上面实现如何在cocos2dx项目里利用JNI调用Android的java层代码。 本人用的是cocos2d-x 2.2.2版本,就用最简单的HelloCpp来当做例子。讲例子之前,希望刚接触的朋友还是先去看看Himi的博客:http://www.himigam

lognic10的专栏 1484

Java跟C.C++相互调用

//由于诸多误解,我对函数注解说明下,这2个参数谁才是真正的皇帝,谁代替谁了//首先、这个函数是我自己为说明问题写的,由于和头文件写在一起,故此加入这个宏,//不然c++编译器报告类型不对,你懂得//其次,这个函数应该是在JVM库里面实现,所以肯定没有这个宏“__cplusplus”,//因为JVM不可能每次会根据你是用C调用还是C++,//还再把自己编译一次是吧,再者JVM是纯C的至于头文件里面...

weixin_34088598的博客 90

Android程序崩溃,如何根据崩溃的日志信息定位出崩溃的行数

在编译Android底层的jni程序时,有两种编译方式:ndk和cmake,现在针对两种不同的编译方式来定位出崩溃的具体行号 ndk: 1、找到你的项目工程里的jni生成的目录,比如说目录为:obj/armeabi/objs/ 2、拿到崩溃的地址,例如:0xabcb1c3d 3、假如说日志崩溃到libgguardian.so库里了,在命令行里执行 arm-linux-androideabi-add...

qq_41163331的博客 1698
上一篇: JNI入门
下一篇: Jasperreport+iReport制作报表
echo7L
博客等级 码龄16年 5粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值