最近项目中需要对程序中一部分代码进行优化,所以要将一部分功能用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文件,生成结果。
附件为测试代码
分享到:
相关推荐
以下是一个完整的示例,展示了如何实现Java调用C的过程: 1. **编写带有native声明的方法的Java类** ```java public class JNI_Test { // 传入一个String类型的字符串并将字符串转化为char类型的字符串后在后台...
在Java程序中,现在可以通过`callCFunction`调用C代码: ```java public class Main { public static void main(String[] args) { NativeDemo demo = new NativeDemo(); demo.callCFunction(); } } ``` ...
这通常通过调用C/C++编译器完成,如在Windows环境下使用`cl.exe`。 5. **加载动态链接库**:在Java代码中使用`System.loadLibrary`方法加载编译后的动态链接库,使Java虚拟机能够访问到其中定义的native方法。 ###...
为了解决这一问题,Java Native Interface (JNI) 提供了一种解决方案,使Java程序能够调用本地C语言编写的代码。 #### 二、JNI简介 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言...
本篇文章将深入探讨如何使用`native`实现Java调用C程序。 首先,了解`native`关键字。在Java中,`native`是一个修饰符,用于标记一个方法,表明该方法的实现是在Java虚拟机(JVM)外部完成的,通常在C或C++中。例如...
在Android系统中,Native Activity是一种特殊的应用程序结构,它允许开发者直接使用C或C++等语言编写的代码创建一个应用,而不必通过Java层进行桥接。Native Activity适用于需要高性能计算或者图形处理的应用场景,...
运行Java程序,Java虚拟机(JVM)会自动调用本地方法`callAddNumbers`,通过JNI桥接调用C语言的`addNumbers`函数。 总结一下,使用JNI调用C语言编写的DLL涉及以下几个步骤: 1. 在Java中声明本地方法。 2. 使用`...
在Java程序中,要调用本地方法,首先需要在Java类中声明该方法,并使用`native`关键字来标记。例如,在本例中,`Main`类中声明了一个名为`printMessage`的native方法: ```java public class Main { static { ...
Java通过JNI(Java Native Interface)调用C语言函数库是一种常见的技术实践,它允许Java程序直接与本地操作系统和硬件交互,提高性能或者利用已有的C/C++代码库。本资料"Java通过JNI调用C语言函数库的方法.zip"提供...
在IT领域,有时我们需要在Java程序中调用由C语言编写的本地库,这通常涉及到跨语言交互。Java可以通过JNI(Java Native Interface)或者第三方库如JNA(Java Native Access)来实现这一功能。本文将深入探讨这两种...
1. **创建JNI接口**:在Java代码中定义native方法,声明将要调用的C函数。 2. **生成头文件**:使用`javah`工具(在Android Studio中自动集成)从Java类生成对应的JNI头文件,这个头文件包含了Java方法名的C声明。 3...
P/Invoke允许托管代码(C#)调用非托管代码(C/C++),这样可以利用C语言编写的高效库来扩展.NET应用程序的功能。下面我们将详细探讨这个过程。 1. **创建C语言动态链接库(DLL)** - 首先,我们需要编写一个C语言...
在Android应用程序开发中,有时需要访问底层硬件功能或者优化性能,这时就可能需要用到JNI(Java Native Interface)技术来调用C/C++代码。JNI允许Java应用程序与本地代码进行交互,包括操作系统内核、驱动程序等。...
JNI允许Java程序调用C、C++等非Java编写的代码,反之亦然,使得Java可以充分利用本地平台的功能,增强应用程序的性能。在Android开发中,JNI的使用尤其广泛,用于实现特定的底层操作或优化性能。 JNI接口由Java...
首先,Java调用C/C++程序的主要技术是通过Java Native Interface (JNI)。JNI是Java平台的一部分,允许Java代码和其他语言写的代码进行交互。它为Java程序员提供了一种方式来编写本地方法,这些本地方法可以调用由C/...
7. **Java调用C/C++方法**:在Java代码中,可以通过实例化类并调用`native`方法来调用C/C++实现的功能。例如,`testdll test = new testdll(); test.set(10); System.out.println(test.get());` 8. **JNI函数原型和...
4. **在Java代码中调用JNI函数**:在Java类中,使用`System.loadLibrary("native-lib")`加载本地库,然后通过`native`关键字声明的函数来调用C/C++函数。例如: ```java public class MainActivity extends ...
本主题“Java调用C程序之HelloWorld”将深入探讨如何在Java程序中调用C语言编写的代码,实现二者的交互。这个过程通常通过Java的JNI(Java Native Interface)技术来完成。 首先,我们需要了解JNI的概念。JNI是Java...
用ReactNative开发的应用,如果在应用内部,想调用小...react-native-wechat 库没有app调用小程序分享的相关功能,所以使用 react-native-wechat-lib库 2.1 react-native-wechat-lib npm地址如下 https://www.npmjs.