JAVA JNI调用C++算法步骤

来源:互联网 发布:中拍协网络拍卖平台首 编辑:程序博客网 时间:2024/06/18 09:32

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 __cplusplusextern "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 文件下执行的

**

0 0
原创粉丝点击