`
schumee
  • 浏览: 26177 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java如何调用C/C++(JNI)

阅读更多

1. program Java source file loading Native method 

 

/** NativeDemo 
* Author: huang_jc 1999/05/20 
* file name: NativeDemo.java 
*/
public class NativeDemo 
{ 
int i; 
int j; 
public static void main(String args[]) 
{ 
NativeDemo ob = new NativeDemo(); 
ob.i = 10; 
ob.j = ob.test(); 
System.out.println("this is ob.i:"+ob.i+"\n"); 
System.out.println("this is ob.j:"+ob.j); 
} 
public native int test(); 
static 
{ 
System.loadLibrary("NativeDemo"); 
} 
} 

 

2.Compile file NativeDemo.java 
Javac NativeDemo.java

 

3.Use javah.exe to produce file NativeDemo.c and NativeDemo.h 
a : javah NativeDemo to produce NativeDemo.h which is:

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <native.h> 
/* Header for class NativeDemo */ 

#ifndef _Included_NativeDemo 
#define _Included_NativeDemo 

#pragma pack(4) 

typedef struct ClassNativeDemo { 
long i; 
long j; 
} ClassNativeDemo; 
HandleTo(NativeDemo); 

#pragma pack() 

#ifdef __cplusplus 
extern "C" { 
#endif 
extern long NativeDemo_test(struct HNativeDemo *); 
#ifdef __cplusplus 
} 
#endif 
#endif 

 

b : use javah -stubs NativeDemo to produce NativeDemo.c which seems as:

 

b : use javah -stubs NativeDemo to produce NativeDemo.c which seems as: 
/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <StubPreamble.h> 

/* Stubs for class NativeDemo */ 
/* SYMBOL: "NativeDemo/test()I", Java_NativeDemo_test_stub */ 
__declspec(dllexport) stack_item *Java_NativeDemo_test_stub(stack_item *_P_,struct execenv *_EE_) { 
extern long NativeDemo_test(void *); 
_P_[0].i = NativeDemo_test(_P_[0].p); 
return _P_ + 1; 
} 

 

4. Write your own implimentation of method test()

//file name test.c 
#include <StubPreamble.h> 
#include "nativedemo.h" 
#include <stdio.h> 

long NativeDemo_test(HNativeDemo *this) 
{ 
printf("hello:!\n"); 
printf("this is in the native method!\n"); 
return (unhand(this)->i)*2; 
}

 

5. link NativeDemo.c and test.c to produce NativeDemo.dll 
Use VC++5.0 tools :Cl.exe 
Cl /GD NativeDemo.c test.c /LD 
then we get NativeDemo.dll 


NativeDemo.c 
test.c 
Generating Code... 

/out:NativeDemo.dll 
/dll 
/implib:NativeDemo.lib 
NativeDemo.obj 
test.obj 
Creating library NativeDemo.lib and object NativeDemo.ex 
Press any key to continue

 

6.Run 

java NativeDemo 

we get the such result: 

 

D:\vj11user\native>java NativeDemo 
hello:! 
this is in the native method! 
this is ob.i:10 

this is ob.j:20 

D:\vj11user\native> 
 


NOTE: 
Do not forget this: 
c:> set INCLUDE=d:\java\include;d:\java\win32;%INCLUDE% 
C:>set LIB =d:\java\lib;%LIB% 
where d:\java is the directory of your jdk 

new version jdk1.2.1 : 

With new jdk1.2.1 : 

1.javac NativeDemo.java 

2. javah NativeDemo to produce head file (You need not to javah -stubs NativeDemo to produce NativeDemo.c file), 

You don`t need the c file. Just the NativeDemo.h is sufficient! 

3.Use VC++ produce a window dll project and add the NativeDemo.h to it. 

then implement the function. All is OK! 
NOTE: the data type conversion between java and c++.See jni.h for more information. 

 

 

 

 

 

分享到:
评论

相关推荐

    jni java调用c/c++

    Java 通过 JNI 调用 C/C++ 实现动态库加载 Java Native Interface (JNI) 是 Java虚拟机(JVM)提供的一种接口,允许 Java 代码和本地代码(如 C/C++)之间的交互。通过 JNI,Java 程序可以调用 C/C++ 代码,实现 ...

    JAVA调用C/C++ DLL文件方法

    JAVA调用C/C++ DLL文件方法 JAVA 调用 C/C++ 库文件(DLL)是 Java 语言与 C/C++ 语言之间的交互方式之一。在 Java 中,存在多种调用 C/C++ 库文件的方式,包括 JNI、JNative、Jawin 和 Jacob 等。其中,JNI(Java ...

    java调用C/C++全过程

    ### Java调用C/C++全过程详解 #### 一、引言 随着软件开发技术的不断发展,跨平台的应用程序越来越受到开发者的青睐。Java作为一种典型的跨平台编程语言,因其一次编写到处运行的特点而广受欢迎。然而,Java作为一...

    使用JNI进行混合编程:在Java中调用C/C++本地库

    本教程将深入讲解如何使用JNI在Java中调用C/C++的本地库。 首先,我们需要理解JNI的基本概念。JNI提供了一套接口,让Java虚拟机(JVM)能够调用本地方法,这些方法由C或C++编写,并编译成动态链接库(如Windows下的...

    JNI开发Java和C/C++互相传递List集合

    JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...

    java调用C/C++过程

    Java调用C/C++的过程,通常被称为JNI(Java Native Interface),是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。对于那些需要利用C或C++的高性能特性的Java开发者来说,JNI是一个重要的工具。...

    Java 调用C/C++程序

    总之,Java调用C/C++程序的能力通过JNI得以实现,这是一种强大的技术,使得Java应用能够充分利用本地系统的资源,同时也保留了Java的跨平台优势。虽然使用JNI会增加代码的复杂性,但其灵活性和性能提升对于许多项目...

    java调用C/C++的例子

    Java调用C/C++是跨语言编程中常见的一种技术,主要通过Java的Native Interface (JNI) 实现。JNI 是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互,尤其是C和C++。在很多情况下,这可以利用现有的...

    JNI DEMO:java jni技术 调用 c/c++ 的dll

    总结来说,这个"JNI DEMO"是一个完整的示例,展示了如何使用Java的JNI技术来调用C/C++编写的DLL。它包括了Java代码、JNI接口的实现、DLL的编译以及Java应用的运行。对于初学者,这是一个很好的实践教程,即使没有...

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

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

    JNI学习指南(java 调用C/C++接口)

    ### JNI学习指南:Java调用C/C++接口详解 #### 一、引言 随着软件开发领域的不断发展,跨语言编程成为一种重要的技能。Java作为一种广泛使用的编程语言,因其跨平台特性和丰富的生态系统受到欢迎。然而,Java作为一...

    android下用java调用c/c++实现jni

    上篇文章中已经介绍了,关于NDK开发环境的搭建,这里不做赘述。这篇文章主要是通过一个例子来说明如何通过eclispe自动生成.h头文件,适合初学者,详见http://write.blog.csdn.net/postedit/42144847

    java写的一个使用jni调用c/c++的dll

    标题中的"java写的一个使用jni调用c/c++的dll"意味着我们要创建一个Java项目,该项目包含一个或多个`native`方法,这些方法的实现将在C/C++中完成。接着,我们需要使用`javah`工具生成JNI头文件,这个头文件定义了...

    jni.zip_c调用java_java 调用 c++_安卓 JNI

    以下将详细阐述JNI的工作原理、使用场景以及如何实现Java调用C/C++和C/C++调用Java。 1. JNI工作原理: JNI的核心思想是通过桥接Java虚拟机(JVM)和本地代码来实现互操作性。在JNI中,Java代码创建一个`native`...

    android C/C++ JNI普通数据类型 测试工程

    当Java层调用C/C++的本地方法时,参数会被自动转换为对应的JNI数据类型。例如,如果你有一个Java方法: ```java public native void passInt(int value); ``` 在C/C++中,你需要定义对应的本地方法: ```c++ ...

    JNI 教程 java与c/c++互相调用

    2. **Java调用C/C++** - **本地方法接口**:Java代码通过`System.loadLibrary()`加载动态链接库(DLL或SO),然后通过`native`方法调用C/C++函数。 - **JNI函数注册**:C/C++代码需要使用`RegisterNatives()`函数...

    java使用(jna)调用c/c++第三方动态库 dll文件 所用jar包

    Java 使用 JNA(Java Native Access)调用C/C++编写的第三方动态库(DLL文件)是一种常见的技术,它允许Java程序直接与本地操作系统接口交互,而无需编写JNI(Java Native Interface)代码。JNA 提供了一种相对简洁...

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

    总结,C++库封装JNI接口实现Java调用C++涉及的主要步骤包括:声明Java中的本地方法,生成JNI头文件,编写C++实现,编译成库,最后在Java中加载并调用。这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种...

    android studio中使用ndk编译.so文件,调用C/C++代码(jni编程)

    总结一下,Android Studio通过集成NDK,使得我们能够在Java应用中调用C/C++代码,实现性能敏感部分的优化。通过编写JNI函数,我们可以利用C/C++的高效特性,同时保持Java的高级语言特性。整个过程包括配置NDK、编写C...

    使用C/C++实现Java的Native方法接口(JNI)/ JNI编程(C/C++) 代码实例

    通过JNI,开发者可以在Java程序中调用C/C++函数,反之亦然。这使得Java能够利用C/C++的高效性能和丰富的库资源。 2. **环境准备** 开始JNI编程之前,需要确保安装了JDK、C/C++编译器(如GCC或Clang),并配置...

Global site tag (gtag.js) - Google Analytics