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
- JAVA JNI调用C++算法步骤
- JNI java调用c函数 native 步骤 代码
- Java调用C JNI
- jni c调用java
- JNI java c 调用
- JNI C调用Java
- jni JAVA调用本地步骤、方法
- 建立Android SDK下的JNI、JAVA应用完整步骤---Android JAVA调用C+
- Java JNI 调用c/cpp
- C语言调用Java JNI
- java JNI调用c程序
- JNI学习-C 调用Java
- JNI-->Java调用C语言
- JNI-->C调用Java语言
- Android JNI C调用Java
- jni - c 调用java方法
- jni 开发 c调用java
- java jni 调用C语言
- Coursera机器学习(Andrew Ng)笔记:大规模机器学习
- 12.Bridge-桥接模式
- HEX----组合数+逆元+思维 山东省第八届省赛D题
- 开发人员的必备技能
- 13.Flyweight-享元模式
- JAVA JNI调用C++算法步骤
- Linux下Zookeeper的(单机)安装与简单测试
- 14.Strategy-策略模式
- Java异常类的继承关系图
- 15.TemplateMethod-模板方法模式
- 17.Iterator-迭代器模式
- 16.Observer-观察者模式
- Install caffe on Ubuntu 14.04 with GTX 1080
- 18.ChainOfResponsibility-职责链模式