java调用c/c++

最近项目想将比较重要的配置文件加密、综合考虑后决定用java jni实现,步骤如下

1.定义java本地接口

package com.msg.jni;



public class JniMsg {


	static {

		try {
			String os = System.getProperty("os.name").toLowerCase();
			String path = "F:/opt/";
			
			System.out.println("work dir:" + path);
			if (os.contains("windows")) {
				System.load(path + "/ext/configlib.dll");
			} else if (os.contains("linux")) {
				System.load(path + "/ext/configlib.so");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	
	public native String[] getAllCate();

	

}

2.生成c/c++头文件

执行 javah -jni -encoding utf-8 -classpath . com.sc.privatecloud.server.jni.JniMessage 命令生成头文件

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

#ifndef _Included_com_msg_jni_JniMsg
#define _Included_com_msg_jni_JniMsg
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_msg_jni_JniMsg
 * Method:    getAllCate
 * Signature: ()[Ljava/lang/String;
 */
JNIEXPORT jobjectArray JNICALL Java_com_msg_jni_JniMsg_getAllCate
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

3.visual studio2013编写c++代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"com_msg_jni_JniMsg.h"

#define CATE_CONFIG_LENGTH  2


char *cate[482] = { "vBtqcNkMKMZ86RvvhgzNhEBdI3mu4oitNWhOFYOpndsaWivNhZNjCt83AhDR4M9wuZ3Tkxydotb+E70kLxwfcg=="
, "uME16Cvnd9zH+QYuv8dOHJVBYVQvcLVc1/GhUJjKjcV4u1jhOYKljsX9vzuE0Dna"
};


jstring   CharToJobjectArray(JNIEnv* env,char **p,int len){
	jclass objClass = (*env)->FindClass(env, "java/lang/String");
	jobjectArray strArray = (*env)->NewObjectArray(env,
		(jsize)len, objClass, 0);
	jstring jstr;

	int i = 0;
	for (; i<len; i++)
	{
		jstr = (*env)->NewStringUTF(env, p[i]);
		(*env)->SetObjectArrayElement(env, strArray, i, jstr);
	}

	return strArray;

}

JNIEXPORT jobjectArray JNICALL Java_com_sc_privatecloud_server_jni_JniMessage_getAllCate
(JNIEnv *env, jobject j){
	return CharToJobjectArray(env,cate,CATE_CONFIG_LENGTH);

}

通过visual studio编译成动态链接库configlib.dll ,配置如下

 

4.测试

public class DemoTest {
	
	public static void main(String args[]) {
		
		JniMsg jnimsg=new JniMsg();
		String [] config= jnimsg.getAllCate();
		
		for(String c:config) {
			System.out.println(c);
		}
	}

}

输出:
vBtqcNkMKMZ86RvvhgzNhEBdI3mu4oitNWhOFYOpndsaWivNhZNjCt83AhDR4M9wuZ3Tkxydotb+E70kLxwfcg==
uME16Cvnd9zH+QYuv8dOHJVBYVQvcLVc1/GhUJjKjcV4u1jhOYKljsX9vzuE0Dna

web.sendcloud.net

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值