Mac下用Java調用c/c++的思路詳解

前言

向量化執行逐漸成為瞭列存數據庫優化的熱門方向,而Java對向量化執行的支持並不如c++,如果要想使用的話,通過JNI來實現可能更加合適。

調用思路

Java

  1. 編寫native的java方法並編譯為class文件
  2. 編譯為.h的頭文件

C/C++

  1.  使用C/C++實現本地方法
  2. 將本地方法生成動態鏈接庫

具體步驟

Java

1.編寫native的java方法並編譯為class文件

這步是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();
    }
}

javac HelloWorld.java生成HelloWorld.class 文件

javac找不到的話,寫絕對路徑或者添加環境變量

2.編譯為.h的頭文件javah HelloWorld生成HelloWorld.h
native的方法需要通過頭文件和c++的實現方法關聯上

在這裡插入圖片描述

 

C/C++

編寫native方法的實現方法

#include "jni.h"
#include "HelloWorld.h" // 將生成的頭文件引入
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){
	//函數簽名需和頭文件中的相對應
    printf("Hello World!\n");
    return;
}

根據文件生成動態鏈接庫

#/bin/bash
export JAVA_HOME=`/usr/libexec/java_home`
echo $JAVA_HOME
gcc -dynamiclib -I $JAVA_HOME/include -I $JAVA_HOME/include/darwin HelloWorldImpl.c -o libhello.jnilib

最後就可以正常運行Java代碼瞭

運行失敗瞭的話,註意檢查Java的代碼中是否加載瞭連接庫

在這裡插入圖片描述

到此這篇關於Mac下用Java調用c/c++的方法的文章就介紹到這瞭,更多相關Java調用c/c++內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: