Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1501483
  • 博文数量: 3500
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 43870
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-03 20:31
文章分类

全部博文(3500)

文章存档

2008年(3500)

我的朋友

分类:

2008-05-04 19:23:52

一起学习
Java如何调用C/C (JNI) 作者:jdeveloper 1. program Java source file loading Native method


//

//

// NativeDemo

// Author: huang_jc 

// 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 

/* 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:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include 



/* 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 

#include "nativedemo.h"

#include 



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. 下载本文示例代码


Java如何调用C/C (JNI)Java如何调用C/C (JNI)Java如何调用C/C (JNI)Java如何调用C/C (JNI)Java如何调用C/C (JNI)Java如何调用C/C (JNI)Java如何调用C/C (JNI)Java如何调用C/C (JNI)Java如何调用C/C (JNI)Java如何调用C/C (JNI)Java如何调用C/C (JNI)Java如何调用C/C (JNI)
阅读(95) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~