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 文件下执行的
**
来源:CSDN
作者:Amin已经存在了
链接:https://blog.csdn.net/aslgm_1/article/details/71514617