您的位置:首页 > 运维架构 > Linux

JNI实现Java调用C++程序(Linux 64位)

2017-09-03 10:19 881 查看

简介

使用Java通过JNI方式调用C++动态库文件

gcc 4.8.5

centos7

jdk 1.8.0

生成C++头文件

写一个native方法,testString,作为Java程序中调用的函数,并生成C++头文件.

JNIDemo.java:

public class JNIDemo {
static{
System.load("/root/workspace/simple/libtest.so");
}
public native String testString(String str);
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}


在当前目录下,生成C++头文件:

javah -jni JNIDemo

生成了JNIDemo.h文件:

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

#ifndef _Included_JNIDemo
#define _Included_JNIDemo
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jstring JNICALL Java_JNIDemo_testString
(JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif


生成so文件

将jdk目录下jni.h, jni_md.h (jdk1.8.0_144/include/jni.h, jdk1.8.0_144/include/linux/jni_md.h)文件拷贝到当前目录下.

JNIDemo.cpp:

#include "JNIDemo.h"
#include "stdlib.h"
JNIEXPORT jstring JNICALL Java_JNIDemo_testString
(JNIEnv *env, jobject obj, jstring jstr1){
char* cha = (char*)env->GetStringUTFChars(jstr1, NULL);
printf("In dll testString :%s\n", cha);
sprintf(cha, "c++");
jstring ret = env->NewStringUTF(cha);
env->ReleaseStringUTFChars(jstr1, cha);
return ret;
}


注意: JNIDemo.h中头文件修改为:

#include "jni.h"


g++命令生成so文件:

g++ -fpic -shared -o libtest.so JNIDemo.c


调用so文件

修改JNIDemo.java文件:

public class JNIDemo {
static{
System.load("/root/workspace/simple/libtest.so");
}
public native String testString(String str);
public static void main(String[] args) {
JNIDemo j = new JNIDemo();
String user="javastr";
String enctypt=j.desEncode(user);
System.out.println(enctypt);
}
}


命令行输入

javac JNIDemo.java
java JNIDemo


输出结果

In dll testString :javastr
c++
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java jni