欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

初试JNI(ubuntu idea clion完整详细步骤)

程序员文章站 2022-06-12 18:14:00
...

1. 安装java

Ubuntu直接采用apt安装,具体安装步骤百度即得,或者终端输入

java -version

根据提示进行安装。

可参考博客:https://www.centos.bz/2018/06/%E5%9C%A8ubuntu-18-04%E4%B8%8A%E4%BD%BF%E7%94%A8apt%E5%AE%89%E8%A3%85java/

2. 安装idea

参考:https://www.linuxidc.com/Linux/2016-12/137946.htm

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

相关标签: jni