JNI的学习(Java调用C++函数,通过DLL)

Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)问题解决 异常出现频率:非必现,乍看不可捉摸。 BUG导致:应用程序崩溃,过一小会儿会自动退出。 Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1) 遇到这个问题很无奈,但是经过不断探索终于找到了问题的原因!!! 这个问题非常不给面子,居然在给上级演示程序的时候突然崩坏! 哭哭哭!!!NND看老子一会儿怎么治你!!! 这个是典型 阅读详情

1. 打开Eclipse创建一个Java工程叫JvmTest1,包名叫:test,类名叫:DemoNative

工程被创建在:C:\dev\proj\android\workspace\JvmTest1


2.DemoNative.java当中的内容如下:

package test;

public class DemoNative 
{
	public native void sayHello();
	
	public void sayHello2()
	{
		System.out.println("Hello sonikk From Java !");
	}
}

3. 使用javah命令自动生成头文件

 进入cmd

# c:

# cd C:\dev\proj\android\workspace\JvmTest1\src

# javah test.DemoNative

这样在C:\dev\proj\android\workspace\JvmTest1\src目录下就会生成一个c++的.h头文件

test_DemoNative.h

内容如下:

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

#ifndef _Included_test_DemoNative
#define _Included_test_DemoNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     test_DemoNative
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_test_DemoNative_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

4. 创建一个C++的Dll工程

选择Win32 Console Application,工程名字叫NativeDemo,

设置工程:

Additional Include Directories:

C:\Program Files\Java\jdk1.7.0_07\include

C:\Program Files\Java\jdk1.7.0_07\include\win32


test_DemoNative.h: (注意将#include <jni.h> 更改为 #include "jni.h")

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

#ifndef _Included_test_DemoNative
#define _Included_test_DemoNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     test_DemoNative
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_test_DemoNative_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

创建一个main.cpp:

#include "test_DemoNative.h"

#include <iostream>
using namespace std;

JNIEXPORT void JNICALL Java_test_DemoNative_sayHello(JNIEnv *env, jobject obj)
{
	cout<<"Hello sonikk!"<<endl;
}

执行编译,这样就会看到:

1>Build succeeded.
1>
1>Time Elapsed 00:00:00.64
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

然后将Debug目录下的NativeDemo.dll,命名为dNativeDemo.dll,表示是debug版本。


将dNativeDemo.dll复制到:

C:\dev\proj\android\workspace\JvmTest1\libs\dNativeDemo.dll

打开Eclipse的Java工程,先进行Refresh,然后进行工程设置:

Properties -> Java Build Path -> Source -> 展开JvmTest1/src -> Native library location

双击,或者点击 Edit...

输入C:/dev/proj/android/workspace/JvmTest1/libs/



修改DemoNative.java:

package test;

public class DemoNative 
{
	public native void sayHello();
	
	public void sayHello2()
	{
		System.out.println("Hello sonikk From Java !");
	}
	
	public static void main(String[] args)
	{
		System.loadLibrary("dNativeDemo");
		DemoNative  demo = new DemoNative(); 
		demo.sayHello(); 
	}
}



运行工程:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\dev\proj\android\workspace\JvmTest1\libs\NativeDemo.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary1(Unknown Source)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at test.DemoNative.main(DemoNative.java:14)


是什么原因呢?怎么办呢?

原来是之前的vs2010工程生成的DLL是x86 platform的,现在需要改变一下工程的设置,以x64 paltform输出DLL



右上角有一个按钮 Configration Manager,选择Active solution paltform,更改Type or select the new platform 为 x64,

重新编译工程,结果新的DLL被输出到了:

NativeDemo\x64\Debug下

从之前的36KB变成了40KB,

同样将名字改为dNativeDemo.dll,然后拷贝到Java工程目录的libs下,设置不变。


运行,成功,OK!!!   \(^_^*





Java学习之通过JNI调用C/C++编写的dll链接库(图文教程) 看了网上几个主要的教程,都会导致出现各种错误,对于初学者来说会造成一些困扰。在这里详细记录一下JNI调用过程。本案例的基本配置:Eclipse+VS2015,Win10  64位 (1)编写Java Project 打开Eclipse,新建一个Java Project,如:LearnJNI。新建包名,如:com.cogito。新建一个类TestNative。 编写代码,如下: pack 阅读详情

相关推荐

Java JNI 调用C#方法

 在编写Java应用程序当中,可以利用C或者CPP来编写DLL函数,然后再Java当中进行调用,从而实现对本地API的调用,这两天因为业务需要,要利用Java调用C#函数。于是研究了一下,发现可以通过Manage C++来实现对C#函数的调用。具体方法如下:首先还是编写Java,利用javah生成CPP头文件。然后跟普通JNI编写过程一样。然后在JNI的借口函数出调用Manage C++方法。

sweetwxh的专栏 9326

java通过JNI调用DLL文件

JNI简介: JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。允许Java代码和其他语言写的代码进行交互。JNI是JDK提供的一个native编程接口。JNI 允许Java程序调用其他语言编写的程序或者代码库, 比如C/C++。Java 在内存管理和性能上有一定的局限,通过JNI我们就可以利用Native程...

Mr.小强的博客 1万+

使用JNI调用DLL文件实例解析

在整个过程中,我们需要搭建好合适的开发环境,准确地定义 Java 本地方法,生成对应的头文件,在 DLL 文件中正确实现本地方法,编译生成 DLL 文件,并妥善处理常见的问题,如找不到 DLL 文件、函数签名不匹配、内存管理问题等。这里的代码实际上是将 Java 调用传递过来的参数再次传递给 DLL 项目中最初编写的 addNumbers 函数(如前面在 “NativeLib.cpp” 中编写的那个简单的 addNumbers 函数),并将结果返回给 Java 程序。(三)在 DLL 文件中实现本地方法。

芊言凝语 1044

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

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

IT1995的博客 6156

JNI简单实现Java调用C++/C的HelloWorld

简介 JVM封装了各种操作系统实际的差异性的同时,提供了JNI技术,它是一种双向的接口,使得开发者可以通过Java代码调用到各种native的 库,反之亦然。所以JNI(Java Native Interface)能作为Java语言的一部分,她能够作为粘合剂将Java应用和其他

Solidfish的专栏 1万+

Java通过JNI调用DLL的实践指南

javah是一个用于生成Java本地接口(JNI)头文件的命令行工具。它负责扫描包含native方法声明的Java类文件,并生成相应的C或C++头文件,这些头文件包含了native方法对应的签名。每个native方法签名都转化成一个C函数原型,这样程序员就可以根据这些原型来编写相应的本地方法实现。工作原理上,javah读取已经通过javac编译的Java类文件,解析其中的native方法声明,并利用这些信息生成对应的头文件。

weixin_42509888的博客 698

Java通过JNI调用C++的DLL文件

第一次接触这个问题,遇到不少坑,来记录下。 1、在eclipse中创建一个Java工程 2、创建一个测试类,如下图MyClass.java 3、cmd打开命令提示符窗口,进入到src目录下,javac命令生成class文件; 4、然后后用javah命令生成 .h头文件,如下图: 5、使用vs2017创建一个工程,如下图: 6、将第四步生成的.h头文件复制到vs工程中,如...

qq_38288172的博客 4736

Java JNI例子--创建DLL、项目导入DLL、IDEA配置JNI、JNI调用DLL(该DLL同时依赖第三方DLL)

创建DLL、项目导入DLL、IDEA配置JNI、JNI调用DLL(该DLL同时依赖第三方DLL)

半夜不熬夜的博客 1881

java调用C/C++写的dll

Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性。Java调用C/C++写好的DLL库时,由于基本数据类型不同、使用字节序列可能有差异,所以在参数传递过程中容易出现问题,DLL中可能需要做相应的转换。使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob. 其JNI(Java Nati

kerry的专栏 7615

【gateway nc adapter虚拟网卡 win11 联想】问题的解决

由于需要登录公司内网,于是启用奇安信VPN。但启动后报出网关未连接的问题,于是我检查了我的网络适配器,并尝试解决,以下给出几种我实践过程中的行动,并附带最后成功的解决方法。

m0_73602417的博客 6550

从逻辑门到存储阵列:NAND与NOR闪存命名与结构原理详解

在数字电路与半导体存储器领域,逻辑门是构建一切复杂功能的基础单元,其输入输出关系定义了计算与存储的基本原理。与非门(NAND)和或非门(NOR)作为通用逻辑门,其真值表和行为模式深刻影响了芯片设计。基于这些原理,现代闪存技术发展出了两种核心架构:NAND Flash和NOR Flash。这两种闪存的命名直接源于其内部存储单元阵列的连接方式,分别模拟了与非门和或非门的逻辑关系。这种结构差异决定了它们根本的技术价值:NOR Flash采用并联结构,支持快速随机读取,适用于代码存储与原地执行(XiP);而NAND

weixin_33377602的博客 339

Java通过JNI调用dll动态库详细步骤

Java通过JNI调用dll动态库,供测试使用。dll实现打印语句‘this is a test from zdll!’,及返回字符串‘hello zdll’的功能

changlina_1989的博客 5427

YOLOv8推理程序

YOLOv8单独推理,有时候我们自定义的模块算子无法正常转换为其他框架,而且需要做成应用,因此需要一个单独推理的程序,返回的是识别后的照片还有各个类别及其对应数量。文章最后给出Flask封装为Server以及调用的实例还有Client请求代码,支持几十路多线程并发,只需加载一次模型,后边推理即可。

AIOT魔法师 698

Java通过JNI调用C++动态链接库dll,并打在jar包内 ——JNA-JNI(一)

Java通过JNI调用C++动态链接库,并打在jar包内 JNI介绍 创建JAVA项目 C++对应的JAVA对象类 windows环境下制作C++动态链接库 JAVA程序调用 打jar包 windows平台下遇到的问题

qq_23858785的博客 1万+

AUTOSAR-SOMEIP配置总结

导入arxml之后someip信号一般以“pduSomeIp”开头或者“SomeIp”开头。以某个pdu为例,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。在导入arxml之后someip信号中有三个特殊的信号,形如“SdInstance”开头的信号,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。“EcuC”模块主要关注“EcucPduCollection”中的“Pdus”下面的配置。

xiandang8023的博客 4653

杰理 JL701N/JL703N USB MIDI 使用教程

摘要:本教程介绍如何在杰理JL701N/JL703N音箱的可视化SDK中配置USB MIDI功能。主要步骤包括:1)启用PC模式;2)修改SDK宏定义启用USB MIDI;3)实现MIDI数据接收处理逻辑;4)调用接口发送MIDI数据;5)使用MIDI-OX测试功能。针对低版本SDK可能出现的设备识别问题,提供了在midi.c文件中添加特定代码行的解决方案。使用前需确保SDK版本达标,并注意备份原始文件。

qq_42014563的博客 1263

Java采用JNI调用VC++生成的dll(Java与C++交互)

应项目需求,需要android调用java,java再调用C++实现android一个图片匹配的功能,我们作为java组需要和C++和Android进行交互。下面是java和C++采用JNI的方式进行接口传参交互,我做的一个demo并运行成功。 什么是JNI? JNI全拼是Java Native Interface,中文意思为Java本地调用。JNI标准是Java平台的一部分,它允许java和其他语言的代码进行交互。JNI开始是为了本地已经编译好的语言,尤其是C和C++而设计的,我们也

Xinghf 1万+

第58篇:AI技术实战:基于深度学习的智能音频内容审核系统

深度学习技术为智能音频内容审核系统提供了强大的支持,通过CNN、RNN和Transformer等模型,能够实现高效的音频内容检测和过滤。使用TensorFlow和Keras可以快速构建和训练音频审核模型,而预训练模型则可以进一步提升性能。数据预处理、特征提取和性能优化是提升智能音频审核系统性能的关键。希望本文的代码示例和注意事项能帮助你更好地理解和应用这些技术。接下来,我们将继续探索更多AI技术实战案例。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 705

java通过jni调用c++并联调

1 jni 1.1 jni简介 本节摘抄自:https://blog.youkuaiyun.com/qq_28261343/article/details/77971823 JNI是Java Native Interface的缩写,中文翻译Java本地接口, 也有译为Java本地调用。JNI是Java语言中的一门强大的技术,由于Android上层采用Java语言实现,所以也可以在Android中使用这门技术。 JNI技术主要是完成Java代码与native代码进行交互,简单说就是用Java代码调用native语言编写的

cdknight_happy的专栏 2173

【STM32实物】基于STM32设计的智能仓储管理系统

近年来,随着我国仓储发展的和药品需求的不断增多,许多医院都采用药物仓储管理系统。我国的药物仓储产业已经有了长足的发展,仓库的规模不断变大,对仓储的要求也不断增高,药物的存储,识别以及对仓储环境条件的要求成为仓储的重要决策,他们可以根据不同的特点在不同场景中使用。本文详细介绍了一个基于单片机技术的智能仓储管理系统的设计与实现,这个系统可谓是集射频识别(RFID)技术和环境监测传感器于一身,旨在提高仓储操作的自动化和精确度。

嵌入式阿齐Archie 1万+

4-都2026年了,嵌入式发展前景怎么样,还适合入行吗?

本文系统分析了嵌入式行业的发展前景,指出到2026年嵌入式将迎来由"万物智联"驱动的黄金周期。文章回顾了嵌入式技术的四个演进阶段,从专用计算机到AIoT时代,强调其技术积累的延续性。作者从人才流向、产业智能化转型、高校新增专业等角度论证嵌入式行业的蓬勃发展,并提出"铁三角"模型分析其驱动力和护城河。最后给出职业发展路径建议,认为嵌入式适合长期主义者,在智能汽车、边缘计算等领域有广阔前景。文章建议读者抓住产业升级机遇,选择这一稳定且有复利效应的技术赛道。

指尖动听知识库 389

java调用C++ DLL库方法

原文链接 摘要: 最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题。经过查找,实现了一个简单的例子。 1、第一步,先在Java中新建一个类     如上图,其中注意这句System.loadLibrary("javaCallcpp");,这就是加载dll文件的代码了。 最近一个项目要开发网页端人脸识别项...

weixin_40581980的博客 6340

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java 通过 JNI 调用 C++ 动态库的完整流程

梳理一下 Java 调用 C++ DLL 的完整流程。编写 Java 类并声明native方法使用javac -h或javah生成 JNI 头文件实现 JNI 桥接层,调用 DLL 中的 C++ 方法使用 Visual Studio 生成 DLL 文件Java 运行时加载并调用本地方法,或者封装成接口给别人使用。

weixin_43993310的博客 1288

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java使用JNI调用C++程序

java使用JNI调用C++程序前言开发工具编写java代码使用java类生成c++的头文件编写C++代码新建1个C++项目拷贝头文件添加头文件开发C++代码配置C++工程生成dll文件把dll文件拷贝到java项目中把dll添加到java的library中运行java程序JNIDemo 前言 日常使用java开发,有时会碰到java难以解决的问题,最近做G711音频转码时,由于java缺少音视频...

黄河边上的牧马人 1481

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调用C++的完整流程

JNI其实是Java NativeInterface的简称,也就是java本地接口。它提供了若干的API实现了和Java和其他语言的通信(主要是C/C++)。           Java以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决Java对本地操作的一种方法就是JNI。           Java通过JNI调用本地方

A cyclist amateur photographer 2916

浅谈JAVA通过JNI调用本地的DLL

        首先了解下,什么是JNI, JNI是Java Native Interface的缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。         使用

今天 1754
上一篇: JNI的学习(C++调用Java函数)
下一篇: 多种螺旋矩阵的算法思考
sonikk
博客等级 码龄15年 68粉丝 113原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值