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!\n");
    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!

寫在最后

   新博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM