[JAVA]JNI之HelloWorld

环境

JAVA:1.8

OS:ubuntu 16.04

--------

在学习java的equals方法和hashcode方法的时候,了解到java的Object类的hashcode方法是一个native方法。初步了解了一点jni,也即JAVA native interface,通过jni可以使用java调用本地其他程序等,这样虽然函数的声明是在java代码中,但函数的实现由其他语言(自己仅知道支持C,C++)实现。

1.首先写一个java的class

public class HelloWorld {
        public native void displayHelloWorld();

        static {
                System.loadLibrary("HelloWorldImpl");
                System.out.println("HelloWorldImpl loaded!");
        }

        public static void main(String[] args) {
                HelloWorld h = new HelloWorld();
                h.displayHelloWorld();
        }
}

native方法的定义很简单,在函数名前加一个native就可以。

在static块中,使用System.loadLibrary,加载库,在Linux环境中,会加载LD_LIBRARY_PATH环境变量配置路径中的libHelloWorldImpl.so动态链接库,这是Linux的默认实现方法。

2.运行javac HelloWorld.java编译java类

3.运行javah -jni HelloWorld生成HelloWorld.h头文件如下

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

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

#ifdef __cplusplus
}
#endif
#endif

可以想象,JAVA自定义了一套c语言的数据结构和函数名规则,来使得java和c按照约定的规则进行调用。

4.编辑HelloWorldImpl.c文件,实现如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
/* Header for class HelloWorld */

/*
 * Class:     HelloWorld
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
  (JNIEnv *env, jobject jo) {
        printf("Hello World!\n");
        return;
}

jni.h在JDK安装路径中中,所以编译的时候,要加入头文件路径

gcc -I /usr/lib/java/jdk1.8.0_121/include -I /usr/lib/java/jdk1.8.0_121/include/linux -fPIC -shared -o libHelloWorldImpl.so HelloWorldImpl.c

5.这个时候可以运行程序了,前面说了,使用System.loadLibrary,加载库,在Linux环境中,会加载LD_LIBRARY_PATH环境变量配置路径中的libHelloWorldImpl.so动态链接库,运行方法1:设置LD_LIBRARY_PATH环境变量,运行java HelloWorld;运行方法二:java -Djava.library.path='.' HelloWorld

 

转载于:https://www.cnblogs.com/wendelhuang/p/7595635.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值