zoukankan      html  css  js  c++  java
  • Mac下Java JNI 调C

    简介

    JNI的实现步骤如下:

    1. 编写带有native声明的方法的Java类
    2. 使用javac命令编译编写的Java类
    3. 使用java -jni className 来生成后缀名为.h的头文件
    4. 使用其他语言(C、C++)实现本地方法
    5. 将本地方法编写的文件生成动态链接库

    我们开始来编写一个简单的Java call C

    1、编写含有native方法的Java类

    public class HelloWorld {
    
        public native void hello();
    
        static {
            //设置查找路径为当前项目路径
            System.setProperty("java.library.path", ".");
            //加载动态库的名称
            System.loadLibrary("hello");
        }
    
        public static void main(String[] args) {
            new HelloWorld().hello();
        }
    }
    

    2、编译代码

    在终端执行 : javac HelloWorld.java

    这时会生成HelloWorld.class 文件

    3、使用java -jni className 生成后缀名为.h的头文件

    在终端执行 : java 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:    hello
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_HelloWorld_hello
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    
    

    4、使用C语言实现本地方法

    创建 HelloWorldImpl.c 文件

    #include "jni.h"
    #include "HelloWorld.h"
    #include <stdio.h>
    JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){
        printf("Hello World!
    ");
        return;
    }
    

    5、将本地方法编写的文件生成动态链接库

    使用命令生成动态链接库:

    gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include HelloWorldImpl.c -o libhello.jnilib
    
    

    libhello.jnilib 就是生成的动态链接库。但是运行这个命令报错了 :

    In file included from HelloWorldImpl.c:1:
    /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include/jni.h:45:10: fatal error: 'jni_md.h' file not
          found
    #include "jni_md.h"
             ^
    1 error generated.
    
    

    提示jni_md.h这个文件找不到;我们执行下面的命令拷贝一份:

    sudo cp /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include
    
    

    在当前目录下执行 : ls -al

    drwxr-xr-x  8 pengwei.xpw  staff   272 Sep 10 15:31 .
    drwxr-xr-x  6 pengwei.xpw  staff   204 Jan  8  2017 ..
    -rw-r--r--  1 pengwei.xpw  staff   567 Sep 10 15:25 HelloWorld.class
    -rw-r--r--  1 pengwei.xpw  staff   377 Sep 10 15:26 HelloWorld.h
    -rw-r--r--  1 pengwei.xpw  staff   341 Sep 10 15:25 HelloWorld.java
    -rw-r--r--  1 pengwei.xpw  staff   174 Sep 10 15:26 HelloWorldImpl.c
    drwxr-xr-x  3 pengwei.xpw  staff   102 Nov  1  2016 com
    -rwxr-xr-x  1 pengwei.xpw  staff  8400 Sep 10 15:31 libhello.jnilib
    
    
    6、last, 执行可执行文件

    终端执行 : java HelloWorld

    结果:

    Hello World!
    
    

    写在最后

       新博客

  • 相关阅读:
    docker-compose
    获取时区
    maven插件
    jquery_ui_api中文
    sax xpath读取xml字符串
    Ant打包
    [转]html5音乐播放器
    javax mail网址
    vbscript调用fso
    fso查找被删除的文件
  • 原文地址:https://www.cnblogs.com/chenmo-xpw/p/7501325.html
Copyright © 2011-2022 走看看