简介
使用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++