教程
进入到src目录下:
/src/company/test/TestNative.java
package com.company.test;
public class TestNative {
public native void sayHello();
public static void main(String[] args) {
// System.setProperty("java.library.path", "../../../");
System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("NativeCode");
TestNative nativeCode = new TestNative();
nativeCode.sayHello();
}
}
编译:
javac ./com/company/test/TestNative.java
生成C++头文件:
javah -jni com.company.test.TestNative
com_company_test_TestNative.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_company_test_TestNative */
#ifndef _Included_com_company_test_TestNative
#define _Included_com_company_test_TestNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_company_test_TestNative
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_company_test_TestNative_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
然后写C++代码:jni_TestNativeImpl.cc
#include <jni.h>
#include "com_company_test_TestNative.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_com_company_test_TestNative_sayHello
(JNIEnv *env, jobject obj) {
printf("From jni_helloworldImpl.cpp :");
printf("Hello world ! \n");
return;
}
然后编译获得:libNativeCode.jnilib
g++ -shared -I /System/Library/Frameworks/JavaVM.framework/Headers jni_TestNativeImpl.cc -o libNativeCode.jnilib
然后在src目录下:
java -Djava.library.path=. com.company.test.TestNative
输出:
.
From jni_helloworldImpl.cpp :Hello world !
From jni_helloworldImpl.cpp :Hello world !
或者:
java com.company.test.TestNative
注意:MacOS 上loadLibrary(“NativeCode”)加载的是libNativeCode.jnilib,后缀不是so而是jnilib。然后注意,headers的目录是/System/Library/Frameworks/JavaVM.framework/Headers 。如果用:
g++ -shared -I /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/include jni_TestNativeImpl.cc -o libNativeCode.jnilib
就会报错:
/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/include/jni.h:45:10: fatal error:
'jni_md.h' file not found
'jni_md.h' file not found