`
lizhensan
  • 浏览: 377620 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

dll库的制作及Java jni的调用

    博客分类:
  • java
 
阅读更多

Java代码

package cn.com.comit.jni;
 
public class HelloJni {
     
    public native void displayHelloJni();
    static{
        System.loadLibrary("hello");
    }
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new HelloJni().displayHelloJni();
    }
 
}

编译class后

 

javah cn.com.comit.jni.HelloJni  生成对应的c的头文件

cn_com_comit_jni_HelloJni.h

 

编写C程序的实现

 

#include <jni.h>
#include <stdio.h>
#include  "cn_com_comit_jni_HelloJni.h"

JNIEXPORT void JNICALL Java_cn_com_comit_jni_HelloJni_displayHelloJni
  (JNIEnv *, jobject)
{
printf("Hello Jni .....\n");
return ;
}

 

cl -I %java_home%\include -I %java_home%\include\win32 -LD Hello.cpp -Fehello.dll

生成动态库,jni.h该头文件在java_home中,所以要包含过来进行编译

cl类似于linux中的gcc

 

运行Java代码测试

Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path

 

hello.dll必须是在JVM属性java.library.path所指向的路径中

 

 1、-Djava.library.path=./c 或动态的形式

 

 2、System.setProperty("java.library.path", System.getProperty("java.library.path") + ";./c");

 

 

两种方式的区别:

如果想在程序中加载一些库文件,使用第一种方式指定java.library.path属性时可以正常载入,而使用第二中方式就不行。java.library.path只有在JVM启动的时候读取一次,因此在java代码中更改java.library.path是不起任何作用的。我们还可以在代码中使用System.load("/jni/library/absolute/path")来加载绝对地址指定的本地库。

 

如果用代码的形式设置必须如下:

 System.setProperty("java.library.path", System.getProperty("java.library.path") + ";./c");

 Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");

 fieldSysPath.setAccessible(true);

 fieldSysPath.set(null, null);//设置为null,这样它就会重新去取最新的值

 

 

分享到:
评论
1 楼 hw1287789687 2014-03-20  
指定java.library.path 的方式:
方式一:
在eclipse运行配置中,VM arguments 中增加:
-Djava.library.path=d:\bin\javalibrary

方式二:
在命令行中运行:
正确:java -Djava.library.path=d:\bin\javalibrary  com.test.jniserver.test
错误:java com.test.jniserver.test -Djava.library.path=d:\bin\javalibrary

注意:java.library.path 可以使用相对路径:
java -Djava.library.path=..\..\..\..\bin\javalibrary  com.test.jniserver.test

相关推荐

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

    Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...

    Java通过JNI调用DLL动态库

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

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

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

    JAVA JNI调用DLL完整步骤

    在某些场景下,比如调用操作系统特定的功能或者利用已有的C/C++库,我们需要使用JNI来实现Java与本地代码(如DLL动态链接库)的交互。本教程将详细介绍如何通过JNI在Java中调用DLL的完整步骤。 1. **创建Java类和...

    Java JNI调用IC卡读卡器

    通过以上步骤,你就可以在Java应用程序中利用JNI调用IC卡读卡器的DLL,实现读取和写入IC卡的功能。注意,调用DLL可能会涉及线程安全、错误处理以及资源管理等问题,所以在实际应用中需要仔细考虑这些因素。此外,...

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

    Java 通过 JNI 调用 C++ 的 DLL 文件 JNI(Java Native Interface)是一种允许 Java 代码和本地应用程序交互的技术。通过 JNI,Java 应用程序可以调用本地库,反之亦然。本文将详细介绍如何使用 JNI 将 Java 应用...

    Java JNI调用DLL方法

    在本案例中,我们讨论的是如何使用Java JNI调用一个名为"AlarmTTS"的VC(Visual C++)动态链接库(DLL)并进行调试。 首先,我们需要了解Java部分的代码。`CallAlarmTTSDll`类是Java程序的核心,它定义了三个本地...

    Java JNI调用动态库(Linux、Windows)的实现步骤

    ### Java JNI调用动态库(Linux、Windows)的实现步骤 #### 一、概述 Java Native Interface (JNI) 是一种标准的 Java 接口,它允许 Java 代码和其他语言(如 C 或 C++)编写的代码进行交互。通过 JNI,Java 应用...

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

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

    Java JNI 调用C++ API/dll 示例程序

    完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接。...

    C++库封装JNI接口-实现java调用c++

    Java程序可以通过JNI调用本地方法,这些本地方法是用其他语言编写的,并通过JNI接口暴露给Java。这个过程涉及到以下几个步骤: 1. **创建本地方法声明**:在Java类中,你需要声明本地方法。这些方法没有具体实现,...

    GMSSL的java调用(JNI库和调用实例).zip

    5. **Java端的JNI调用**:在Java代码中加载动态库,然后通过`System.loadLibrary()`方法调用相应的JNI函数。 在实际应用中,开发人员需要考虑兼容性问题,如不同操作系统下的动态库加载方式、32位与64位系统的差异...

    java调用C语言编写的so库中的函数,java调用C语言编写的dll库中的函数

    例如,`java jni调用so中的函数api.txt`中可能包含了具体的JNI函数调用示例。 其次,JNA是一种更高级的接口,它提供了更简洁的方式来调用本地库,无需编写C/C++代码。JNA通过映射Java方法到本地函数,减少了编程...

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

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

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

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

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

    假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 C 语言的数据结构,调用已有的 ? dll/so 中公布的函数。 然后再在 Java...

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

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

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单

    JNI允许Java代码和其他语言写的代码进行交互,包括调用C/C++编译的动态链接库(DLL)文件。下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,...

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

    ### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...

Global site tag (gtag.js) - Google Analytics