Java native 关键字简单案例(Mac)

Posted 徐春晖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java native 关键字简单案例(Mac)相关的知识,希望对你有一定的参考价值。

java native关键字:允许开发者通过调用c/c++的程序满足自己的开发需求。

在java中声明一个native方法,但不通过java实现,而是用c/c++实现这个方法。

在java中通过调用c/c++生成的动态链接库,从而达到自己的开发需求。

java本身也有许多native方法(比如StrictMath.java中),也是通过c/c++实现StrictMath.java中的方法,在jvm中调用并返回结果实现的。

流程说明在NativeTest.java中

文件目录结构:

  • src
    • jni.h
    • jni_md.h
    • libhello.jnilib
    • NativeTest.java
    • /**
       * 步骤:
       * 1. 编写一个java文件,比如:NativeTest.java,其中包含native方法
       * 2. 使用 javac NativeTest.java 命令生成class文件
       * 3. 使用 javah -classpath . -jni Java.NativeTest(全限定名称) 命令生成 Java_NativeTest.h 文件
       * 4. 查看 Java_NativeTest.h 文件中的方法
       * 5. 编写 NativeTestImpl.c 文件,并实现其中的方法
       * 6. 将 /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/include/jni.h
       *      /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/include/darwin/jni_md.h
       *      复制到src目录下
       *    sudo cp jni.h ~/WorkSpace/study/src
       *    sudo cp ./darwin/jni_md.h ~/WorkSpace/study/src
       * 7. 使用如下命令生成动态链接库
       *    gcc -dynamiclib NativeTestImpl.c -o libhello.jnilib
       *    在mac下,.jnilib 是固定的,名字必须要以 lib 开头,在调用的时候,必须吧 lib 省略,只需要写 hello
       * 8. 运行java程序,调用 native 方法
       *    使用命令 java NativeTest
       *
       * 可能遇到的问题:
       * 问题一:
       * ./Java_NativeTest.h:2:10: error: \'jni.h\' file not found with <angled> include; use "quotes" instead
       * #include <jni.h>
       * 解决方法:
       * 将 Java_NativeTest.h 中 #include <jni.h> 改为 #include "jni.h"
       *
       */
      public class NativeTest {
      
          public native void hello();
      
          static{
              //设置查找路径为当前项目路径
              System.setProperty("java.library.path", ".");
              //加载动态库的名称
              System.loadLibrary("hello");
          }
      
          public static void main(String[] args) {
              new NativeTest().hello();
          }
      }
      NativeTest.java
    • NativeTest.h
    • /* DO NOT EDIT THIS FILE - it is machine generated */
      #include "jni.h"
      /* Header for class NativeTest */
      
      #ifndef _Included_NativeTest
      #define _Included_NativeTest
      #ifdef __cplusplus
      extern "C" {
      #endif
      /*
       * Class:     NativeTest
       * Method:    hello
       * Signature: ()V
       */
      JNIEXPORT void JNICALL Java_NativeTest_hello
        (JNIEnv *, jobject);
      
      #ifdef __cplusplus
      }
      #endif
      #endif
      NativeTest.h
    • NativeTestImpl.c
    • #include "jni.h"
      #include "NativeTest.h"
      #include <stdio.h>
      
      JNIEXPORT void JNICALL Java_NativeTest_hello(JNIEnv *env, jobject obj){
          printf("NaviteTest hello world!\\n");
          return ;
      }
      NativeTestImpl.c

       

以上是关于Java native 关键字简单案例(Mac)的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程——Thread的native底层实现

Java JVM:内存溢出(栈溢出,堆溢出,持久代溢出以及 nable to create native thread)

Java的native关键字

JVM 笔记

JVM 笔记

Mac下Java JNI (java native interface)调C