1. 程式人生 > >初試JNI(ubuntu idea clion)

初試JNI(ubuntu idea clion)

1. 安裝java

Ubuntu直接採用apt安裝,具體安裝步驟百度即得,或者終端輸入

java -version

根據提示進行安裝。

2. 安裝idea

3. 在idea建立java檔案:

public class JniExample {
    static {
        System.load("/root/IdeaProjects/JNItryagain/libtest32.so");
    }
    public native String getStringFromC();
    public static void main(String[] args){
        System.out.println(new JniExample().getStringFromC());
    }
}

4. 生成.h檔案

點選build,會生成一個out資料夾,裡面包含jniExample.class,開啟終端在包含jniExample.class的路徑下執行

 javah JniExample

執行javah時,class檔案和java檔案不能放一起,詳情見上條部落格。

5.拷貝生成的jniExample.h到新建的clion專案。

開啟clion,生成一個新的專案,將剛剛生成的jniExample.h拷貝到這個專案中,同時也把j/usr/lib/jvm/java-8-openjdk-amd64/include下的jni.h,以及 /usr/lib/jvm/java-8-openjdk-amd64/include/linux

下的jni_md.h拷貝到專案中。即本專案現在有五個檔案:jni.h  jni_md.h  JniExample.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class JniExample */

#ifndef _Included_JniExample
#define _Included_JniExample
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JniExample
 * Method:    getStringFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_JniExample_getStringFromC
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

main.cpp

#include "JniExample.h"

JNIEXPORT jstring JNICALL Java_JniExample_getStringFromC(JNIEnv *env, jobject thisObj) {

    return (env)->NewStringUTF("hello from libtestcpp");
}

CMakeLists.txt.

6. 生成.so檔案

 gcc -m32 main.cpp JniExample.h jni.h jni_md.h -fPIC -shared -o libtestcpp32.so -lstdc++

-m32是生成32位的so檔案,-lstdc++ 表明編譯的是c++檔案。

若此時報錯 bits/c++config.h: No such file or directory,則需要安裝多版本編譯模式:

sudo apt-get install gcc-multilib g++-multilib

7. 拷貝so檔案

將生成的libtestcpp32.so檔案拷貝到idea的專案中,位置如下:

/root/IdeaProjects/JNItryagain/libtestcpp32.so

8. 執行結果

hello from libtestcpp

Process finished with exit code 0