在Intellij IEDA 做 java和 c/c++混編


最近公司項目做語音錄音,涉及導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 混編技能!

 


免責聲明!

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



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