JNI(Java Native Interface,) java本地接口

本文介绍JNI(Java Native Interface)的基本概念及使用方法,演示了如何通过JNI实现Java代码与C/C++代码之间的交互,并提供了一个简单的示例。

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

JNI是SUN(被Oracle收购了)定义的一套标准接口。具体平台上的jvm实现,对应对实现JNI接口,供本地(c/c++)应用与java VM 互调。

JNI,是一套完善并且功能强大的双向接口,能够实现语言的互操作性--可以供java代码调用native代码,native代码也可以调用java代码。

--------------

JNI是Java平台中的一个强大特性,应用程序可以通过JNI把C/C++代码集成进Java程序中。通过JNI, 开发者在利用Java平台的强大功能同时,又可以复用原有的代码,因为JNI是Java平台定义的规范接口,当把本地库集成到Java中,只要在一个平台上解决了语言互操作问题,就可以把解决方案比较容易的移植到其他平台上。

-----------------------

一个JNI编程的简单例子:

Java代码 复制代码 收藏代码
  1. package com.test;
  2. public class HelloWorld {
  3. public native void displayHelloWorld();
  4. static
  5. {
  6. System.loadLibrary("fileName");
  7. }
  8. public static void main(String[] args) {
  9. new HelloWorld ().displayHelloWorld();
  10. }
  11. }
package com.test;

 public class HelloWorld {
     public native void displayHelloWorld();

     static
     {
        System.loadLibrary("fileName");
     }

     public static void main(String[] args) {
        new HelloWorld ().displayHelloWorld(); 
     }
 }
然后根据写好的文件编译成CLASS文件
然后在classes或bin之类的class根目录下执行javah -jni com.test.HelloWorld,
就会在根目录下得到一个com_test_HelloWorld.h的文件

该.h文件的详细内容如下:

Java代码 复制代码 收藏代码
  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class com_test_HelloWorld */
  4. #ifndef _Included_com_test_HelloWorld
  5. #define _Included_com_test_HelloWorld
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class: com_test_HelloWorld
  11. * Method: displayHelloWorld
  12. * Signature: ()V
  13. */
  14. JNIEXPORT void JNICALL Java_com_test_HelloWorld_displayHelloWorld
  15. (JNIEnv *, jobject);
  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_test_HelloWorld */

#ifndef _Included_com_test_HelloWorld
#define _Included_com_test_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_test_HelloWorld
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_test_HelloWorld_displayHelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


然后根据头文件的内容编写com_test_HelloWorld.c文件
Java代码 复制代码 收藏代码
  1. #include "com_test_HelloWorld.h"
  2. #include "jni.h"
  3. #include "stdio.h"
  4. JNIEXPORT void JNICALL Java_com_test_HelloWorld_displayHelloWorld (JNIEnv *, jobject) {
  5. printf("Hello world!\n");
  6. return;
  7. }
#include "com_test_HelloWorld.h"
 #include "jni.h"
 #include "stdio.h"

 JNIEXPORT void JNICALL Java_com_test_HelloWorld_displayHelloWorld  (JNIEnv *, jobject) {
     printf("Hello world!\n");
     return;
 }
之后编译生成DLL文件如“fileName.dll”,名称与System.loadLibrary("fileName")中的名称一致
vc的编译方法:cl -I%java_home%\include -I%java_home%\include\win32 -LD com_test_HelloWorld.c -FefileName.dll
最后在运行时加参数-Djava.library.path=[dll存放的路径]

-LD:生成动态链接库

-D:设置Java平台的系统属性。设置后JavaVm可以找到对应的库文件。

其中参数JNIEnv * JNIEnv结构包括JNI函数表 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值