Linux下JNI demo

  1. 核心

    • 核心

      • java函数用C语言实现逻辑
    • 好处

      • C代码效率高,在某些情况下更适合.
  2. java代码

    • 代码

      public class Test
      {
                
                
         public native void show();
         public static void main(String[] args)
         {
                
                
             System.load("/path/to/Test.so");
             (new Test()).show();
         }
      }
      
      
    • 说明

      • show和普通函数一样.
      • Test.so路径是绝对路径.
      • 加了native表示是C实现,需要从共享库中找对应的实现.
  3. C实现

    • 获取函数的类型和函数名

      • javah Test得到头文件.
      • 头文件内容是对应的函数名和类型以及说明.
    • 头文件

      /* DO NOT EDIT THIS FILE - it is machine generated */
      #include <jni.h>
      /* Header for class Test */
      
      #ifndef _Included_Test
      #define _Included_Test
      #ifdef __cplusplus
      extern "C" {
                
                
      #endif
      /*
      * Class:     Test
      * Method:    show
      * Signature: ()V
      */
      JNIEXPORT void JNICALL Java_Test_show
       (JNIEnv *, jobject);
      
      #ifdef __cplusplus
      }
      #endif
      #endif
      
    • 函数名

      • Java_${packet_name}_${class_name}_${function_name}.
      • 这里对应Java_Test_show,因为packet_name为空.所以去掉了_${packet_name}.
  4. 实现java代码

    • c实现

      #include"Test.h"
      #include<stdio.h>
      JNIEXPORT void JNICALL Java_Test_show
       (JNIEnv *env, jobject object)
      {
                
                
             printf("c print\n");
      }
      
    • 编译

      • gcc -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux Test.c -fPIC -shared -o Test.so
      • JAVA_HOME是配置的环境变量,可以直接替换成java所在目录.
  5. 执行

    • javac Test.java && java Test

おすすめ

転載: blog.csdn.net/rubikchen/article/details/119210020