Mac下Java JNI (java native interface)調C
1.編寫帶有native聲明的方法的Java類
2.使用javac命令編譯編寫的Java類
3.使用java -jni className 來生成後綴名為.h的頭文件
4.使用其他語言(C、C++)實現本地方法
5.將本地方法編寫的文件生成動態鏈接庫
一代碼:(不要帶包路徑)
/**
* native-0study
*
* @author xuedui.zhao
* @create 2018-04-23
*/
public class HelloWorld {
public native void hello();
static{
System.loadLibrary("hello");
}
public static void main(String[] args){
new HelloWorld().hello();
}
}
二:
在終端執行 : javac HelloWorld.java
這時會生成HelloWorld.class 文件
三:使用java -jni className 生成後綴名為.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
四:創建 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;
}
五:將本地方法編寫的文件生成動態鏈接庫
gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/include HelloWorldImpl.c -o libhello.jnilib
此時會拋出異常:
HelloWorldImpl.c:1:10: fatal error: ‘jni.h‘ file not found
#include "jni.h"
^~~~~~~
1 error generated.
六:sudo cp /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/include
七:ls -al
drwxr-xr-x 7 xuedui.zhao staff 224 4 23 21:35 .
drwxr-xr-x 9 xuedui.zhao staff 288 4 23 11:52 ..
-rw-r--r-- 1 xuedui.zhao staff 442 4 23 14:07 HelloWorld.class
-rw-r--r-- 1 xuedui.zhao staff 377 4 23 14:07 HelloWorld.h
-rw-r--r-- 1 xuedui.zhao staff 276 4 23 14:06 HelloWorld.java
-rw-r--r-- 1 xuedui.zhao staff 170 4 23 21:27 HelloWorldImpl.c
-rwxr-xr-x 1 xuedui.zhao staff 8400 4 23 21:35 libhello.jnilib
八:終端執行 : java HelloWorld
Hello World!
Mac下Java JNI (java native interface)調C