`

使用 Jni 调用 Dll 的实现(使用VS2008 生成Dll)

阅读更多

前言

-----------------------本前言来自网络--------------------------

JNI技术的出现主要是基于三个方面的应用需求:

1. 解决性能问题 

2. 解决本机平台接口调用问题

3. 嵌入式开发应用
-------------------------前言结束--------------------------------

 

下面动手来实现使用Jni调用本地方法,本实例演示 Java 调用 Native 本地方法传递参数并且返回结果。具体内容如下:

 

第一步:编写Java端代码

定义一个Java类

----------------------------------------------

public class TestNativeDemo { 
  
    // 声明本地方法 
    public native String testJni(String arg); 
  
    static { 
        // 加载DLL文件 
        System.loadLibrary("TestNativeDemoCPP"); 
    } 
  
    public static void main(String args[]) { 
        TestNativeDemo ob = new TestNativeDemo(); 
        // 调用本地方法 
        String result = ob.testJni("Hello,Jni"); // call a native method 
        System.out.println("TestNativeDemo.testJni=" + result); 
    } 
}

 

----------------------------------------------

编译之后在生成TestNativeDemo.class的bin目录下执行javah TestNativeDemo命令生成头文件TestNativeDemo.h

----------------------------------------------

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h> 
/* Header for class TestNativeDemo */
  
  
#ifndef _Included_TestNativeDemo //避免重复包含头文件  
#define _Included_TestNativeDemo 
#ifdef __cplusplus //c++编译环境中才会定义__cplusplus  
extern "C" { //告诉编译器下面的函数是c语言函数(因为c++和c语言对函数的编译转换不一样,主要是c++中存在重载)   
  
#endif 
/* 
 * Class:     TestNativeDemo 
 * Method:    testJni 
 * Signature: (Ljava/lang/String;)Ljava/lang/String; 
 */
JNIEXPORT jstring JNICALL Java_TestNativeDemo_testJni 
  (JNIEnv *, jobject, jstring); 
  
#ifdef __cplusplus 
} 
#endif 
#endif
 

----------------------------------------------

 

第二步:生成DLL库

1. 打开VS2008,创建一个名称为TestNativeDemoCpp的C++ Win32项目。在向导的应用程序类型处选择DLL,点完成。设置Release+Win32编译配置。

2. 将签名生成的TestNativeDemo.h文件拷贝到TestNativeDemoCpp项目的根目录下,然后在VS中右键头文件文件夹添加现有项把这个头文件包含进来,接下来就是编辑TestNativeDemoCpp.cpp文件。

----------------------------------------------

// TestNativeDemoCpp.cpp : 定义 DLL 应用程序的导出函数。 
#include "stdafx.h" 
  
#include <jni.h> 
#include "TestNativeDemo.h" 
#include <stdio.h> 
  
  
JNIEXPORT jstring JNICALL Java_TestNativeDemo_testJni (JNIEnv *env,jobject obj,jstring pString){ 
  
    //从jstring中获取本地方法传递的字符串 
  
     const char *nativeString = env->GetStringUTFChars(pString, 0);   
  
     printf("%s", nativeString);   
  
     //DON'T FORGET THIS LINE!!!   
     env->ReleaseStringUTFChars(pString, nativeString);   
  
     return pString; 
}
 

----------------------------------------------

3. VS开发环境默认不会识别jni.h头文件,在JDK中找到jni.h,并添加jni.h所在目录到当前工作路径:右键项目,属性-通用属性-C/C++-常规项在右边的附加包含目录中把%JAVA_HOME%/include和%JAVA_HOME%/include/win32加进来。

4. 右键项目的资源文件加入资源-版本信息。编译项目,在项目的Release下面找到TestNativeDemoCpp.dll文件,也有可能在项目的上层目录的release下边,跟设置有关。

 

第三步:运行Java调用DLL程序

把第二步产生的TestNativeDemoCpp.dll文件拷贝到第一步产生TestNativeDemo.class的同一目录。

执行命令:java TestNativeDemo

输出:Hello,JniTestNativeDemo.testJni=Hello,Jni

 

-----------------------结束--------------------------

分享到:
评论

相关推荐

    JAVA项目JNI调用dll实现DEMO源码,C++&JAVA

    完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...

    Java通过JNI调用DLL动态库

    Java通过JNI调用DLL动态库,亲测试编写

    JAVA JNI调用DLL完整步骤

    总结,Java调用DLL的完整步骤包括:定义Java的`native`方法,使用`javah`生成头文件,编写C/C++ DLL代码,编译DLL,最后在Java程序中调用。这个过程可能需要对JNI规范有深入理解,以及一定的C/C++编程基础。通过熟练...

    java运用jni调用dll实现屏蔽系统热键和任务栏

    Java使用JNI调用DLL来实现系统热键屏蔽与任务栏隐藏是一种跨平台编程技术的应用,主要涉及Java的本地接口(JNI)和Windows API。本文将深入解析这一技术的关键点,并提供相关的知识背景。 首先,JNI(Java Native ...

    Java JNI调用DLL方法

    总结起来,Java JNI调用DLL主要涉及以下步骤: 1. 定义Java本地方法。 2. 使用`javah`生成C/C++头文件。 3. 在VC项目中实现头文件中的函数,引入必要的库和头文件。 4. 编译生成DLL库。 5. 设置Java的`java.library....

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    问题描述: 在开发项目过程中,需要处理算法分析出来二进制流数据,并对数据解析处理转发。我们上层应用平台是使用java开发的...那现在上层应用面临的问题:访问java外部功能接口实现方式(即调用dll)怎么选择及实现?

    在windows中jni(生成dll)Linux中jni(生成so),java调用曾c++

    在本主题中,我们将深入探讨如何在Windows和Linux环境中利用JNI来生成动态链接库(DLL for Windows,SO for Linux),并使Java能够调用C++编写的函数。 1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一...

    [JAVA]使用JNI技术实现JAVA程序调用dll

    使用 JNI 技术实现 JAVA 程序调用 dll JAVA 语言的跨平台特性深受 Java 程序员们的喜爱,但正是由于它为了实现跨平台的目的,使得它和本地机器的各种内部联系变得很少,大大约束了它的功能。例如与一些硬件设备通信...

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

    JNI 将 Java 应用程序与 C++ DLL 文件集成需要以下步骤:创建一个 Java 工程,生成 `.class` 文件,使用 `javah` 命令生成 `.h` 头文件,创建一个 C++ 工程,并将生成的 `.h` 头文件复制到工程中,编写 C++ 代码,并...

    JAVA通过JNI调用C#dll的整个项目工程

    本项目工程提供了完整的Java、C++和C#的示例,可以帮助开发者理解如何在实际项目中实现Java通过JNI调用C# DLL的过程,从而提升应用的性能或实现特定的功能。通过学习和实践这个工程,开发者可以进一步提升跨语言编程...

    使用JNI,vs2010 生成dll, JSP中调用dll

    本教程将详细介绍如何使用JNI,Visual Studio 2010来生成DLL动态链接库,并在JSP(Java Server Pages)中调用这些DLL。 首先,让我们理解JNI的基本原理。JNI是Java平台标准的一部分,它为Java程序员提供了一种方法...

    j2ee通过jni调用dll

    在"j2ee通过jni调用dll"的场景中,Java应用服务器(如Tomcat、WebLogic等)运行J2EE应用程序时,可以通过JNI接口调用一个DLL。这通常发生在以下情况:需要利用操作系统提供的低级别功能,如文件I/O、硬件控制或者...

    springboot+jna/jni调用动态so/dll库

    在这种情况下,"springboot+jna/jni调用动态so/dll库"是一个重要的主题,它涉及到Spring Boot应用如何利用Java Native Interface (JNI) 和 Java Native Access (JNA) 这两种技术来调用操作系统级别的动态链接库(.so...

    jni调用第三方dll最简单的实例

    总结来说,这个实例展示了如何使用JNI调用第三方DLL的基本步骤:在Java中声明native方法,生成JNI头文件,实现C/C++代码并调用DLL函数,最后编译生成本地库。虽然这是一个简单的例子,但理解这些基本概念对于深入...

    java使用JNI调用C++ dll库用法概述

    Java使用JNI(Java Native Interface)调用C++ DLL库是一种常见的技术,特别是在需要利用Java的跨平台特性同时利用C++的高效性能时。JNI提供了一种桥梁,使得Java代码能够直接与本地代码交互,比如C++编译的动态链接...

    JNI调用第三方dll实例

    在本实例中,我们将深入探讨如何使用JNI调用第三方DLL(动态链接库)文件,这是在Java应用程序中利用C++或C代码能力的常见场景。这个实例是在Visual Studio 2010环境下构建的,但请注意,其他环境可能需要不同的配置...

    jni调用c++ delphi中的dll.

    JNI(Java Native Interface)是Java平台提供的一种标准接口,用于在Java...通过以上步骤,你就可以成功地在Java程序中通过JNI调用C++和Delphi编写的DLL函数了。这在需要利用现有本地库或执行低级操作的场合非常有用。

    JNI--java调用不同平台的动态链接库,dll,so,完美,全教程

    我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦的。 假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 ...

    JNI 调用实例(java JNI cpp互相调用实例)

    通过本文,我们可以了解 Java 和 C++ 之间的互相调用实例的实现过程,包括 C++ DLL 文件的创建和使用,以及 Java 代码中使用 JNI 技术调用 C++ DLL 文件的实现细节。这种技术可以应用于需要 Java 和 C++ 之间互相...

    java通过JNI调用dll的事例 附说明

    总结,通过JNI调用DLL,主要步骤包括: 1. 在Java中定义native方法。 2. 使用`System.loadLibrary`加载DLL。 3. 编写C/C++代码实现native方法。 4. 编译C/C++代码生成DLL。 5. 在Java代码中调用native方法。 这个...

Global site tag (gtag.js) - Google Analytics