今天看了《core java卷二》的第十二章,在自己寫代碼的時(shí)候還是踩到了一些坑点待,因此在這里記錄一下。
1弃舒、創(chuàng)建java類癞埠,建議不要加包名,省的后面找不到類(我之前加了包名聋呢,導(dǎo)致后面各種找不到或無法加載主類
苗踪。。)
public class HelloNative {
public static native void greeting();
static {
System.loadLibrary("hellonative");
}
public static void main(String[] args) {
HelloNative.greeting();
}
}
greeting方法就是我們要用C語言實(shí)現(xiàn)的方法坝冕。System.loadLibrary用于加載動(dòng)態(tài)鏈接庫徒探。
2、編譯這個(gè)類喂窟。
javac HelloNative.java
3测暗、調(diào)用javah來生成頭文件HelloNative.h
javah -jni HelloNative
HelloNative.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */
#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: greeting
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
4、在HelloNative.c中給出函數(shù)的實(shí)現(xiàn)代碼磨澡。
HelloNative.c
#include "HelloNative.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloNative_greeting(JNIEnv * env, jclass jcl){
printf("Hello Native !\n");
return;
}
5碗啄、將C代碼編譯到動(dòng)態(tài)鏈接庫中。
gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/include HelloNative.c -o libhellonative.jnilib
其中稳摄,JDK的目錄各位讀者請(qǐng)自行調(diào)整稚字。
gcc的-I選項(xiàng)指定尋找頭文件的目錄,主要是由于HelloNative.h中有一行
#include <jni.h>
,而jni.h這個(gè)文件就在
/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/include
目錄下面胆描。
同理瘫想,由于jni.h里面有一行#include "jni_md.h"
,
如果/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/include
目錄下面沒有jni_md.h昌讲,則會(huì)報(bào)下面錯(cuò)誤:
Cannot open include file: 'jni_md.h': No such file or directory
這時(shí)候把jni_md.h拷貝到
/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/include
目錄里面即可国夜。
gcc編譯成功后,就會(huì)得到libhellonative.jnilib
這個(gè)文件短绸。
在HelloNative.java文件中车吹,有一行代碼:
System.loadLibrary("hellonative");
就是用來加載libhellonative.jnilib
的。
注意:在執(zhí)行g(shù)cc命令時(shí)醋闭,-o libhellonative.jnilib
中窄驹,hellonative前面的lib不可以缺少!Vぢ摺@植骸(我就因?yàn)楹雎粤诉@個(gè),網(wǎng)上查了好久的才發(fā)現(xiàn)瑟曲,都是淚啊饮戳。。)
否則洞拨,會(huì)報(bào)no XXX in java.library.path
錯(cuò)誤扯罐。
6、執(zhí)行java HelloNative
烦衣,打印Hello Native !
歹河,調(diào)用成功~