这两天因为工作需要,组长告诉我了一个新名词jni,让我利用它用java调用c/c++的库。剩下的,就是自个百度学习去吧。我从网上也看到了好多例子,但是差不多都是转载的他人的。我根据自己的实战简单总结一下吧,有不妥之处,还望友友们指正哈~_~
第一步:在MyEclipse环境下新建一个java project工程
工程名字是jnitest,在src下面建立两个java类:
HelloWorld.java
public class HelloWorld {
public native void say(String name); //native 是java本地方法申明;native方法就是我们需要用C来实现的方法。
public HelloWorld(){
}//开始我没有添加这个构造函数,但是在测试类调用的时候就一直无法new 对象。所以还是加上吧。
static {
System.loadLibrary( "HelloWorld" ); //装入动态链接库,"HelloWorld"是要装入的动态链接库名称。就是dll文件的名字
}
}
TestDLL.java
public class TestDLL {
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
helloWorld.say("tom");//传递参数
}
}
第二步:编译Java类
在编写完java类之后,在工程的bin目录下回自动生成相应的class文件的。
第三步 生成C/C++头文件
在windows中打开一个命令窗口,进入jnitest工程所在目录下的bin目录如:D:\Workspaces\jnitest\bin。键入javah -classpath D:\Workspaces\jnitest\bin HelloWorld命令生成头文件HelloWorld.h。内容如下:这个文件就在 D:\Workspaces\jnitest\bin这个目录下面
HelloWorld.h
/* 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: say
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_HelloWorld_say
(JNIEnv *, jobject, jstring);
/**这里的jstring类型是根据HelloWorld类中的方法参数类型而自动生成的*/
#ifdef __cplusplus
}
#endif
#endif
这个h文件就不要动它啦哈!
第四步 编写本地方法实现
在这个步骤中要用到vc6工具了,我都不会用这个工具,在摸索中前进吧。不会的友友可以看一下截图。
这样工程就自动生成了cpp和h文件。
把刚才第三步生成的h文件的内容覆盖vc自动生成的h文件。
利用下面的代码覆盖vc自动生成的cpp文件:
HelloWorld.cpp
// HelloWorld.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "HelloWorld.h"
#include <stdio.h>
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//HelloWorld.h中函数声明相同 JNIEnv *是每个函数都有的参数, 它包含了很多有用的方法, 使用起来类似Java的反射, 也提供了这样一个编码转换的函数.
GetStringUTFChars()和NewStringUTF(), 第一个是从UTF8转换为C的编码格式, 第二个是根据C的字符串返回一个UTF8字符串.
JNIEXPORT void JNICALL Java_HelloWorld_say
(JNIEnv *env, jobject obj, jstring instring)
{
//从instring字符串取得指向字符串UTF编码的指针
const jbyte *str =
(const jbyte *)env->GetStringUTFChars( instring, JNI_FALSE );
printf("%s say HelloWorld!/n",str);//(*env)->GetStringUTFChars()这个方法, 是用来在Java和C之间转换字符串的, 因为Java本身都使用了双字节的字符, 而C语言本身都是单字节的字符, 所以需要进行转换.
//通知虚拟机本地代码不再需要通过str访问Java字符串。
env->ReleaseStringUTFChars( instring, (const char *)str );
//ReleaseStringUTFChars()是用来释放对象的, 在Java中有虚拟机进行垃圾回收, 但是在C语言中, 这些对象必须手动回收. 否则可能造成内存泄漏.
return;
}
然后,选中C工程HelloWorld,右键--build,如果没有错误,那么恭喜你咯,这个就通过啦!
在工程目录下面的debug文件下面会有生成的HelloWorld.dll文件。
第五步 运行测试程序
把HelloWorld.dll文件copy到java工程中引用的jdk路径bin文件下面,我的是:C:\Program Files\Genuitec\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\bin
运行测试程序,将看到控制台输出“tom say HelloWorld!/n”
据说用jni在32位的机器上可以调用c/c++库,但是在64位的上面就不可以,怎么在64位的电脑上调用c/c++库,这才是我们组长最终要我解决的问题。如果有哪位高人知道的话,麻烦给俺指点一下哈~~
- 大小: 6.4 KB
- 大小: 6.3 KB
- 大小: 27.8 KB
- 大小: 22.3 KB
- 大小: 18.6 KB
分享到:
相关推荐
本文将深入探讨如何使用Java通过JNI调用C/C++编写的DLL动态链接库。 首先,JNI提供了一个标准的方法,让Java代码可以与本地代码交互,如C/C++。在Java程序中,我们定义`native`方法,这些方法的实现不在Java字节码...
JNI允许Java代码和其他语言写的代码进行交互,包括调用C/C++编译的动态链接库(DLL)文件。下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,...
在这个"JNI DEMO"中,我们将探讨如何使用JNI来调用C/C++编译生成的DLL(动态链接库)文件。 首先,我们需要了解JNI的基本工作原理。JNI为Java程序提供了一种机制,使得Java代码可以声明native方法,这些方法在Java...
JNI提供了一套接口,让Java虚拟机(JVM)能够调用本地方法,这些方法由C或C++编写,并编译成动态链接库(如Windows下的.dll或Linux下的.so文件)。JNI框架包括了Java端的本地方法声明和本地方法实现,以及C/C++端的...
### JNI调用C++动态链接库入门:详细解析与实践指南 #### 一、引言 Java Native Interface(JNI)是Java平台提供的一种强大的机制,它允许Java代码调用本地的C或C++代码,从而利用这些语言在性能、系统访问等方面...
利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。...详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)
5. **加载库**:在Java中,`System.loadLibrary()`会加载前面创建的动态链接库,使得Java能够调用C++实现的本地方法。 6. **测试和调试**:在Java程序中调用本地方法,验证C++代码是否正确工作。可能需要对JNI接口...
在这种情况下,"springboot+jna/jni调用动态so/dll库"是一个重要的主题,它涉及到Spring Boot应用如何利用Java Native Interface (JNI) 和 Java Native Access (JNA) 这两种技术来调用操作系统级别的动态链接库(.so...
Java 使用 JNI(Java Native Interface)调用 C++动态链接库是一种常见的技术,它允许 Java 代码与本地 C 或 C++代码交互,以利用 C++的高性能特性或利用已有的 C++库。以下是对标题和描述中涉及的知识点的详细解释...
4. **编译JNI代码**:说明如何使用javah工具生成C/C++的头文件,以及如何使用C/C++编译器编译生成动态链接库(如.so或.dll文件)。 5. **加载库和调用函数**:解释如何在Java代码中加载动态链接库,并调用其中的方法...
如果`mylib`是一个动态链接库(.dll on Windows, .so on Linux, .dylib on macOS),加载代码如下: ```java MyLib myLib = (MyLib) Native.load("mylib", MyLib.class); ``` 现在,你可以像调用Java方法一样调用`...
2. 编译配置:JNI代码需要通过javah工具生成头文件,然后使用C/C++编译器生成动态链接库。 三、JNI编程流程 1. 创建Java类并声明本地方法:在Java源码中,声明一个native方法,并使用JNIEXPORT和 JNICALL修饰符。 2...
### JAVA如何调用DLL:用JNI调用C或C++动态链接库详解 #### 一、引言 在跨语言编程领域中,Java Native Interface (JNI) 是一种强大的工具,它允许Java应用程序直接调用本地代码(如C或C++)。这种能力在处理性能...
- 减少JNI调用次数。 - 避免频繁的数据复制。 - **解决本机平台接口调用问题:** - 使用平台相关的API。 - 处理不同操作系统下的差异。 - **嵌入式开发应用(JNI小例子):** - 定义新的类和方法。 - 处理Java...
本项目涉及的"java调用C++动态链接库dll接口"是解决这种跨语言交互问题的一种方法,主要利用了Java Native Interface(JNA)这一技术。 JNA是Java平台的标准库,它允许Java代码直接调用本机库(如DLL或.so文件)的...
接着,开发者在C/C++环境中实现这个头文件中的方法,并编译为动态链接库(Windows上的DLL或Unix上的SO文件)。最后,Java程序加载这个库,并通过JNI调用这些本地方法。 JNI的调用流程如下: 1. 在Java类中声明...
3. **编译并链接**:编译C/C++源代码,并将其链接成动态链接库(Windows下为.dll,Linux/Unix下为.so)。 4. **复制库文件**:将生成的动态链接库复制到Java程序的运行路径下。 5. **调用本地方法**:在Java程序中...
### Java JNI调用动态库(Linux、Windows)的实现步骤 #### 一、概述 Java Native Interface (JNI) 是一种标准的 Java 接口,它允许 Java 代码和其他语言(如 C 或 C++)编写的代码进行交互。通过 JNI,Java 应用...
将C/C++源代码编译为动态链接库(Windows下为`.dll`,Unix/Linux下为`.so`)。 5. **加载库文件**: 在Java程序中加载动态链接库,可以通过`System.loadLibrary()`方法指定库文件名。 ```java public class ...