`
lcf11824
  • 浏览: 87963 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

使用native方法调用C程序

阅读更多

     最近项目中需要对程序中一部分代码进行优化,所以要将一部分功能用C语言实现,这就涉及到java和C的交互。

     今天做了一个小demo,主要用C语言实现了一个累加功能,java调用C生成的dll库。

运行环境:Win7+ Eclipse Version: Helios + MinGW1.5.6

 

(1)安装MinGW,配置环境变量。

    右击我的电脑,点属性->高级->环境变量。
1、在PATH里加入C:\MinGW\bin(MinGW的安装目录)
2、新建LIBRARY_PATH变量,在值中加入C:\MinGW\lib,这是标准库的位置。
3、新建C_INCLUDEDE_PATH变量,值设为C:\MinGW\include。
4、新建CPLUS_INCLUDE_PATH变量,值为C:\MinGW\include\c++\3.4.5;C:\MinGW\include\c++\3.4.5;

C:\MinGW\include\c++\3.4.5\backward;C:\MinGW\include


(2)编写CallTest.java文件

 

public class CallTest {

	static {
		System.loadLibrary("plus");
	}
	
	public static native int getPlusAnswer(int x);
	
	public static void main(String...args){
		System.out.println("answer of 10="+getPlusAnswer(100));
	}
}

 进入到工程项目的bin目录,使用javah CallTest命令,生成CallTest.h文件。

如下所示:

 

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

#ifndef _Included_CallTest
#define _Included_CallTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     CallTest
 * Method:    getPlusAnswer
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_CallTest_getPlusAnswer
  (JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif

 其中Java_CallTest_getPlusAnswer是我们关心的方法,这便是后面要具体实现的方法。


(3)编写plus.c实现功能,该源文件引用(2)中的头文件。

 

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

int n=0;
int j=0;
int answer=0;

JNIEXPORT jint JNICALL Java_CallTest_getPlusAnswer
  (JNIEnv *env, jclass class, jint x){
	n=x;
	for(j=1;j<=n;j++)
		answer+=j;
	return answer;
}

 

(4)好了,接下来编译plus.c文件生成plus.o

进入文件的目录,使用命令

 

 gcc -c -I"C:\Program Files\Java\jdk1.6.0_10\include" -I"C:\Program Files\Java\jdk1.6.0_10\include\win32" -o plus.o plus.c

 这里两个引号是jdk安装目录下的一些c头文件的目录

 

(5)新建plus.def文件,用于生成dll

plus.def文件内容如下

 

EXPORTS
Java_CallTest_getPlusAnswer

 第二行是方法名

生成dll文件plus.dll

 

gcc -shared -o plus.dll plus.o plus.def

 

(6)拷贝plus.dll到工程目录下

*:System.loadLibrary("plus")的引号中是文件在工程的相对路径,默认是工程文件的根目录。

执行java文件,生成结果。

 

    附件为测试代码

0
0
分享到:
评论
2 楼 lcf11824 2010-12-23  
weiqiang.yang 写道
可以试试jna项目
https://jna.dev.java.net/
在调用上会方便很多,只管写dll和java类就行,采用direct mapping的话,官方号称效率跟jni差不多

引用
JNA direct mapping can provide performance near that of custom JNI. Nearly all the type mapping features of interface mapping are available, although automatic type conversion will likely incur some overhead.

改天尝试一下~
1 楼 weiqiang.yang 2010-12-23  
可以试试jna项目
https://jna.dev.java.net/
在调用上会方便很多,只管写dll和java类就行,采用direct mapping的话,官方号称效率跟jni差不多

引用
JNA direct mapping can provide performance near that of custom JNI. Nearly all the type mapping features of interface mapping are available, although automatic type conversion will likely incur some overhead.

相关推荐

    java调用c语言

    以下是一个完整的示例,展示了如何实现Java调用C的过程: 1. **编写带有native声明的方法的Java类** ```java public class JNI_Test { // 传入一个String类型的字符串并将字符串转化为char类型的字符串后在后台...

    java语言方法调用C语言函数

    在Java程序中,现在可以通过`callCFunction`调用C代码: ```java public class Main { public static void main(String[] args) { NativeDemo demo = new NativeDemo(); demo.callCFunction(); } } ``` ...

    Java中native方法学习

    这通常通过调用C/C++编译器完成,如在Windows环境下使用`cl.exe`。 5. **加载动态链接库**:在Java代码中使用`System.loadLibrary`方法加载编译后的动态链接库,使Java虚拟机能够访问到其中定义的native方法。 ###...

    java怎么调用C语言

    为了解决这一问题,Java Native Interface (JNI) 提供了一种解决方案,使Java程序能够调用本地C语言编写的代码。 #### 二、JNI简介 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言...

    Native:使用native实现java调用C程序的

    本篇文章将深入探讨如何使用`native`实现Java调用C程序。 首先,了解`native`关键字。在Java中,`native`是一个修饰符,用于标记一个方法,表明该方法的实现是在Java虚拟机(JVM)外部完成的,通常在C或C++中。例如...

    NativeActivity调用过程

    在Android系统中,Native Activity是一种特殊的应用程序结构,它允许开发者直接使用C或C++等语言编写的代码创建一个应用,而不必通过Java层进行桥接。Native Activity适用于需要高性能计算或者图形处理的应用场景,...

    JAVA调用C语言写的dll的方法和实例

    运行Java程序,Java虚拟机(JVM)会自动调用本地方法`callAddNumbers`,通过JNI桥接调用C语言的`addNumbers`函数。 总结一下,使用JNI调用C语言编写的DLL涉及以下几个步骤: 1. 在Java中声明本地方法。 2. 使用`...

    使用Java Native Interface调用本地C++代码.txt

    在Java程序中,要调用本地方法,首先需要在Java类中声明该方法,并使用`native`关键字来标记。例如,在本例中,`Main`类中声明了一个名为`printMessage`的native方法: ```java public class Main { static { ...

    Java通过JNI调用C语言函数库的方法.zip

    Java通过JNI(Java Native Interface)调用C语言函数库是一种常见的技术实践,它允许Java程序直接与本地操作系统和硬件交互,提高性能或者利用已有的C/C++代码库。本资料"Java通过JNI调用C语言函数库的方法.zip"提供...

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

    在IT领域,有时我们需要在Java程序中调用由C语言编写的本地库,这通常涉及到跨语言交互。Java可以通过JNI(Java Native Interface)或者第三方库如JNA(Java Native Access)来实现这一功能。本文将深入探讨这两种...

    Android JNI调用c语言加密程序

    1. **创建JNI接口**:在Java代码中定义native方法,声明将要调用的C函数。 2. **生成头文件**:使用`javah`工具(在Android Studio中自动集成)从Java类生成对应的JNI头文件,这个头文件包含了Java方法名的C声明。 3...

    csharp中调用c语言示例

    P/Invoke允许托管代码(C#)调用非托管代码(C/C++),这样可以利用C语言编写的高效库来扩展.NET应用程序的功能。下面我们将详细探讨这个过程。 1. **创建C语言动态链接库(DLL)** - 首先,我们需要编写一个C语言...

    Android应用程序使用JNI调用驱动程序

    在Android应用程序开发中,有时需要访问底层硬件功能或者优化性能,这时就可能需要用到JNI(Java Native Interface)技术来调用C/C++代码。JNI允许Java应用程序与本地代码进行交互,包括操作系统内核、驱动程序等。...

    关于java中的native方法

    JNI允许Java程序调用C、C++等非Java编写的代码,反之亦然,使得Java可以充分利用本地平台的功能,增强应用程序的性能。在Android开发中,JNI的使用尤其广泛,用于实现特定的底层操作或优化性能。 JNI接口由Java...

    java调用c c++程序实例

    首先,Java调用C/C++程序的主要技术是通过Java Native Interface (JNI)。JNI是Java平台的一部分,允许Java代码和其他语言写的代码进行交互。它为Java程序员提供了一种方式来编写本地方法,这些本地方法可以调用由C/...

    Java通过JNI调用C语言的方法[参考].pdf

    7. **Java调用C/C++方法**:在Java代码中,可以通过实例化类并调用`native`方法来调用C/C++实现的功能。例如,`testdll test = new testdll(); test.set(10); System.out.println(test.get());` 8. **JNI函数原型和...

    JniDemo Android调用C语言

    4. **在Java代码中调用JNI函数**:在Java类中,使用`System.loadLibrary("native-lib")`加载本地库,然后通过`native`关键字声明的函数来调用C/C++函数。例如: ```java public class MainActivity extends ...

    Java调用C程序之HelloWorld

    本主题“Java调用C程序之HelloWorld”将深入探讨如何在Java程序中调用C语言编写的代码,实现二者的交互。这个过程通常通过Java的JNI(Java Native Interface)技术来完成。 首先,我们需要了解JNI的概念。JNI是Java...

    《ReactNative》app调用小程序的分享

    用ReactNative开发的应用,如果在应用内部,想调用小...react-native-wechat 库没有app调用小程序分享的相关功能,所以使用 react-native-wechat-lib库 2.1 react-native-wechat-lib npm地址如下 https://www.npmjs.

Global site tag (gtag.js) - Google Analytics