zoukankan      html  css  js  c++  java
  • [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!
    ");
            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

  • 相关阅读:
    Oracle Flashback Table
    新上线MySQL数据库规划
    Spark启动流程(Standalone)- master源码
    Spark启动流程(Standalone)-分析
    Spark Netty 通信框架解析
    Spark内核概述
    SparkStreaming DStream转换
    Spark-Core RDD依赖关系
    Spark-Core RDD中函数(变量)传递
    Spark-Core RDD行动算子
  • 原文地址:https://www.cnblogs.com/wendelhuang/p/7595635.html
Copyright © 2011-2022 走看看