最近公司項目做語音錄音,涉及導c++和java混合開發。研究了幾天混編知識,這里總結下,記錄下自己的勞動成果。
1. 什么是JNI?
JNI是Java Native Interface的縮寫,它提供了若干的API實現了Java和其他語言的通信(主要是C&C++)。從Java1.1開始,JNI標准成為java平台的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,但是它並不妨礙你使用其他編程語言,只要調用約定受支持就可以了。使用java與本地已編譯的代碼交互,通常會喪失平台可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的。例如,使用一些舊的庫,與硬件、操作系統進行交互,或者為了提高程序的性能。JNI標准至少要保證本地代碼能工作在任何Java 虛擬機環境。
2. 開始demo
-JniTest -src -main -java -com -jni -test
1)新建JniTest.java, 注意包路徑 這里是 com.jni.test
package com.jni.test; public class JNITest { //定義一個本地方法 public native int sayHello(); }
2) 編譯JniTest.java,生成JniTest.class文件
javac JniTest.java
3) 生成JniTest.h c/c++ 頭文件,注意com.jni.test.JniTest不帶任何后綴
cd 到 包的跟目錄 這里是src/main/java javah com.jni.test.JniTest
JniTest.h
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_jni_test_JniTest */ #ifndef _Included_com_jni_test_JniTest #define _Included_com_jni_test_JniTest #ifdef __cplusplus extern "C" { #endif /* * Class: com_jni_test_JniTest * Method: sayHello * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_jni_test_JniTest_sayHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
4)新建JniTest.cpp 文件
/* DO NOT EDIT THIS FILE - it is machine generated */ #include "com_jni_test_JniTest.h" #include <string.h> /* Header for class NativeMethodTest */ #ifndef _Included_JniTest #define _Included_JniTest #ifdef __cplusplus extern "C" { #endif /* * Class: NativeMethodTest * Method: intMethod * Signature: (I)I */ JNIEXPORT int JNICALL Java_com_jni_test_JniTest_sayHello (JNIEnv *, jobject){ return 123456; }
5) 生成動態連接庫,MAC:.jnilib Linux: .so 注意linux系統 生成的鏈接庫必須以lib開頭,如libJniTest.so/ libJniTest.jnilib
MAC
gcc -I /System/Library/Frameworks/JavaVM.framework/Headers -c JniTest.cpp
就可以得到一個編譯好的文件JniTest.o
,下面需要把.o文件
打包成動態庫
。
gcc -dynamiclib -o libJniTest.jnilib JniTest.o
得到動態鏈接庫 libJniTest.jnilib
Linux:
待更新
6)編寫測試代碼,Jnimaintest.java
static{ System.loadLibrary("JniTest"); } public static void main(String[] args){ JniTest jniTest = new JniTest(); System.out.println("========== Say hallow! start =========="); System.out.println(jniTest.sayHello()); System.out.println("========== Say hallow! end =========="); }
運行測試類: 遇到
java no XXX in java.library.path
可以run =》Edit configurations 配置,路徑換成你自己的 鏈接庫所在的位置
如果要運行在tomcat容器中,需要把鏈接庫放到tomcat目錄下面的bin目錄下即可
大功告成,get 混編技能!