Java如何调用C/C (JNI)

本文介绍了一个具体的例子,展示如何通过JNI让Java程序调用C/C++代码。从定义Java类到生成本地方法头文件,再到实现C/C++函数并编译链接生成动态链接库,最后在Java中调用这些本地方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; /* 336x280, 创建于 07-11-21 */ google_ad_slot = "0989131976"; google_ad_width = 336; google_ad_height = 280; // </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值