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

简介

使用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++
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值