java jni 远程调用_JNI远程调用

本文详细介绍了如何使用Java JNI进行远程调用,通过一个简单的'HelloWorld'示例展示了在Windows和Linux环境下,从Java调用C/C++实现的本地函数的完整步骤,包括编译Java源码、生成头文件、创建C/C++源码、编译动态库以及运行Java程序加载本地库。
摘要由CSDN通过智能技术生成

part1.JNI介绍:

JNI其实是Java Native Interface的简称,也就是java本地接口。

简单点说就是从java里面可以调用用c/c++实现的函数

part2.例子:打印HelloWorld

文件清单:

1.java类 HelloWorld.java

package com.edie.jni;

class HelloWorld {

public native void print();//#1

public static void main(String[] args) {

HelloWorld test=new HelloWorld();

test.print();

}

static {//#2

System.loadLibrary("HelloWorld");//#3

}

}

tips:

#1 native 声明用c/c++实现的方法;

#2 使用loadLibrary方法装载含有该方法的本地库 HelloWorld.dll 或 libHelloWorld.so(linux下)

#3 static 代码块,使Java VM初始化一个类时,首先执行这部分代码,这可保证调用本地方法前,装载了本地库。

2.com_edie_jni_HelloWorld.h

#include

#ifndef _Included_com_edie_jni_HelloWorld

#define _Included_com_edie_jni_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

JNIEXPORT void JNICALL Java_com_edie_jni_HelloWorld_print

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

3.HelloWorld.c文件

#include #include "jni.h"

#include "com_edie_jni_HelloWorld.h"

JNIEXPORT void JNICALL

Java_com_edie_jni_HelloWorld_print(JNIEnv *env, jobject obj)

{

printf("Hello World!\n");

return;

}

windows下调用动态库dll

step0.配置Eclipse环境

Eclipse中的配置:将项目的working directory 设置为工程的bin目录,这样Eclipse自动编译后的*.class文件就会保存的bin下面,并 且生成的头文件也会保存在bin根

目录下。

Vc++中的配置:在Tools->Options->Directories中设置jni.h jni_md.h的路径,%JAVA_HOME%\include及%JAVA_HOME%\include\win32

step1.编译java文件

javac HelloWorld.java 编译java文件,生成.class 文件。

step2.生成java头文件

在工程bin根目录下执行命令

javah -jni com.edie.jni.HelloWorld    -jni 为默认参数,可有可无。生成的头文件为:com_edie_jni_HelloWorld.h

关键部分如下:

JNIEXPORT void JNICALL

Java_com_edie_jni_HelloWorld_print (JNIEnv *, jobject);

tips1.com_edie_jni  为HelloWorld.java文件的包路径;

tips2.该函数声明,接受两个参数,第一个参数是指向JNIEnv结构的指针; 第二个参数,为HelloWorld对象自身,即this指针。

补充:ifndef和ifdef的知识 见

step3.根据java头文件生成c文件

在VC++中新建一个Win32 Dynamic-Link library工程,选择An empty DLL project空工程。

我的工程是HelloWorld,把刚刚生成的那个头文件拷贝到这个工程的根目录里。

新建source code:elloWorld.c 实现头文件中的函数Java_com_edie_jni_HelloWorld_print

step4.生成dll文件

F7编译文件,成功后在debug目录中生成HelloWorld.dll文件

step5.运行java文件

将HelloWorld.dll文件复制到工程的bin根目录下,

在Eclipse中运行。

Linux下调用动态库so

step0.配置环境

配置jdk

step1.编译java文件

javac HelloWorld.java -d .

// 将会在当前目录生成包路径com/eide/jni文件夹,如果

// 没有定义-d .那么将直接在当前目录生成HelloWorld.class

step2.生成java头文件

javah com.edie.jni.HelloWorld //必须写完整的包路径,生成com_edie_jni_HelloWorld.h文件

step3.根据java头文件生成c文件

vim创建HelloWorld.c 并引入com_edie_jni_HelloWorld.h头文件

step4.生成so文件

F7编译文件,成功后在debug目录中生成HelloWorld.dll文件;

gcc -fPIC -shared -o libHelloWorld.so HelloWorld.c 生成libHelloWorld.so文件

补充gcc编译参数,见

step5.运行java文件

java -Djava.library.path=. HelloWorld //-Djava.library.path=.指定so文件的位置

./HelloWorld

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值