JAVA JNI调用C++算法步骤

こ雲淡風輕ζ 提交于 2019-11-27 14:24:29

JAVA JNI调用C++算法步骤

1、创建一个Java程序(HelloWorld.java)

package com.xiaomo.jni;

public class HelloWord {

    public native void sayHello(String string);

    static {
        System.out.println(System.getProperty("java.library.path"));//后文放.dll库或者.so 库要用到这个路径
        System.loadLibrary("HelloWordSO");//linux调用.so库;windows调用.dll库
    }

    public static void main(String[] args) throws InterruptedException {
        HelloWord jni = new HelloWord();
        jni.sayHello("hello liu");
    }
}

2、用javac编译HelloWorld.java生成HelloWorld.class。

 javac com/xiaomo/jni/JNITest.java

3、用javah编译HelloWorld.class生成HelloWorld.h头文件,后文c++调用这个头文件

 javah com.xiaomo.jni.HelloWord(因为要带包名)

这是刚生成的头文件内容 文件名为 com_xiaomo_jni_HelloWord.h

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


#ifndef _Included_com_xiaomo_jni_HelloWord
#define _Included_com_xiaomo_jni_HelloWord
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_xiaomo_jni_HelloWord
 * Method:    sayHello
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_xiaomo_jni_HelloWord_sayHello  //后文c++需要实现的方法
  (JNIEnv *, jobject, jstring);


#ifdef __cplusplus
}
#endif
#endif

4、创建HelloWorld.cpp,实现HelloWorld.h定义的函数

#include <jni.h>
#include "com_xiaomo_jni_HelloWord.h"
#include <stdio.h>

//实现java编译成头文件里的方法
JNIEXPORT void JNICALL Java_com_xiaomo_jni_HelloWord_sayHello
(JNIEnv * env, jobject arg, jstring instring)
{
    // 从 instring 字符串取得指向字符串 UTF 编码的指针
    const jbyte *str =
        (const jbyte *)env->GetStringUTFChars(instring, JNI_FALSE);
    printf("Hello,%s\n", str);
    // 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。
    env->ReleaseStringUTFChars(instring, (const char *)str);
}

5、编译HelloWorld.c生成libHelloWorldSO.so (这里主要针对linux系统,window系统可以用vs 生成dll文件)

(步骤一)

gcc -fPIC -D_REENTRANT -I/usr/java/jdk1.8.0_65/include -I/usr/java/jdk1.8.0_65/include/linux -c HelloWorld.cpp

(注意一定需要包含Java的include目录(请根据自己系统环境设定),因为Helloworld.c中包含了jni.h)

(步骤二)

gcc -shared HelloWord.o -o libHelloWordSO.so   //注意加上lib,linux系统调用库文件。这是Linux的链接规定的,一个库的必须要是:lib+库 名+.so。链接的时候只需要提供库名就可以了。

6、在java虚拟机运行java程序HelloWorld

 java com/xiaomo/jni/HelloWord

7、这个时候会报错的 java.lang.UnsatisfiedLinkError;需要用到(1)运行时打印出来的 java.library.path的路径

/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib    //这是我系统的
//之后将第五步生成的 libHelloWordSO.so 文件放在上面随意路径下,例如 /usr/lib  下;

  此时,运行java代码 就可以成功调用c++中的方法了。

注意:我上面那些命令都是在包的顶层文件下执行的,

这是顶层目录结构

这里写图片描述

1、com层文件的包名文件第一层
2、/JavaJNI 是随便创建的一个文件夹,可以看到.h文件.cpp文件都是放在这里的

这是java文件位置:

这里写图片描述
**

以上命令都是在 /JavaJNI 文件下执行的

**

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!