VC环境下利用JNI调用Java类连接Cassandra数据库

在VC环境下,创建虚拟机对象,进而调用Java类,实现预先定义好的连接Cassandra数据库功能,满足某种业务需要

首先定义连接Cassandra的Java代码,包含插入、查询功能

import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.List;

import org.apache.cassandra.thrift.Cassandra;
import org.apache.cassandra.thrift.Cassandra.Client;
import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.ColumnOrSuperColumn;
import org.apache.cassandra.thrift.ColumnParent;
import org.apache.cassandra.thrift.ColumnPath;
import org.apache.cassandra.thrift.ConsistencyLevel;
import org.apache.cassandra.thrift.InvalidRequestException;
import org.apache.cassandra.thrift.KeyRange;
import org.apache.cassandra.thrift.KeySlice;
import org.apache.cassandra.thrift.NotFoundException;
import org.apache.cassandra.thrift.SlicePredicate;
import org.apache.cassandra.thrift.SliceRange;
import org.apache.cassandra.thrift.TimedOutException;
import org.apache.cassandra.thrift.UnavailableException;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

public class Cassandratest{

	public static String KEYSPACE = "NDOUTILS";
	public static String HOST = "172.16.0.204";
	public static int PORT = 9160;
	public static String COLUMN_FAMILY = "logentries";

	private static Client client;
	private static TSocket socket;
	private static TTransport transport;
	private static TProtocol protocol;
	private boolean isOpen = false;
	
	public static void main(String args[]){
		Cassandratest ccl = new Cassandratest();
		ccl.init();
		ccl.end();
	}

	Cassandratest(String keyspace, String column_family, String host,
			int port) {
		// TODO Auto-generated constructor stub
		KEYSPACE = keyspace;
		COLUMN_FAMILY = column_family;
		HOST = host;
		PORT = port;
	}

	Cassandratest() {

	}

	private static ByteBuffer strToBB(String msg) {
		Charset charset = Charset.forName("UTF-8");
		return ByteBuffer.wrap(msg.getBytes(charset));
	}

	private static String byteToStr(byte[] buf) {
		Charset charset = Charset.forName("UTF-8");
		return new String(buf, charset);
	}

	private void init() {
		try {
			socket = new TSocket(HOST, PORT);
			transport = new TFramedTransport(socket);
			protocol = new TBinaryProtocol(transport);
			client = new Cassandra.Client(protocol);
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		if (!isOpen) {
			try {
				transport.open();
				client.set_keyspace(KEYSPACE);
				System.out.println("Opening...OK");
			} catch (TTransportException e) {
				// TODO Auto-generated catch block
				System.out.println("Network is unreachable...");
			} catch (InvalidRequestException e) {
				// TODO Auto-generated catch block
				System.out.println("请求无效");
			} catch (TException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			isOpen = true;
			// insertNewColumn(COLUMN_FAMILY, "logentry_id", "value", "0000");
		} else {
			System.out.println("连接已经打开");
		}
	}

	private void end(){
		if (isOpen) {
			try {
				transport.flush();
				transport.close();
				System.out.println("Closing...OK");
			} catch (TTransportException e) {
				// TODO Auto-generated catch block
				System.out.println("Network is unreachable...");
			}
		} else {
			System.out.println("连接已经关闭");
		}
	}

	@SuppressWarnings("unused")
	private Column insertNewColumn(String ColumnFamily, String Field,
			String Name, String Value) {
		long timestamp = System.currentTimeMillis();
		Column column = new Column(strToBB(Name));
		column.setValue(strToBB(Value));
		column.setTimestamp(timestamp);
		try {
			client.insert(strToBB(Field), new ColumnParent(ColumnFamily),
					column, ConsistencyLevel.ONE);
			return column;
		} catch (InvalidRequestException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (UnavailableException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (TimedOutException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (TException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}

	@SuppressWarnings("unused")
	private ColumnOrSuperColumn getColumn(String ColumnFamily, String Field,
			String Name, boolean print) {
		ColumnPath path = new ColumnPath(ColumnFamily);
		path.setColumn(strToBB(Name));
		try {
			ColumnOrSuperColumn column = client.get(strToBB(Field), path,
					ConsistencyLevel.ONE);
			if (print) {
				System.out.println(byteToStr(column.getColumn().getName())
						+ ":" + byteToStr(column.getColumn().getValue()));
			}
			return column;
		} catch (InvalidRequestException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (NotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (UnavailableException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (TimedOutException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (TException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}

	@SuppressWarnings("unused")
	private SlicePredicate getPredicate(String RangeFrom, String RangeTo,
			boolean reversed, int GetNum) {
		SlicePredicate predicate = new SlicePredicate();
		predicate.setSlice_range(new SliceRange(strToBB(RangeFrom),
				strToBB(RangeTo), reversed, GetNum));
		return predicate;
	}

	@SuppressWarnings("unused")
	private List<ColumnOrSuperColumn> getRangeValue(String ColumnFamily,
			String Field, SlicePredicate Predicate, boolean Print) {
		List<ColumnOrSuperColumn> columns;
		try {
			columns = client.get_slice(strToBB("test1"), new ColumnParent(
					COLUMN_FAMILY), Predicate, ConsistencyLevel.ONE);
			if (Print) {
				for (ColumnOrSuperColumn aColumn : columns) {
					System.out.println(byteToStr(aColumn.getColumn().getName())
							+ ":" + byteToStr(aColumn.getColumn().getValue()));
				}
			}
			return columns;
		} catch (InvalidRequestException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (UnavailableException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (TimedOutException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (TException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}

	@SuppressWarnings("unused")
	private List<KeySlice> ListFieldValue(String ColumnFamily,
			String FromField, String ToField, SlicePredicate Predicate,
			boolean print) {
		// check all range--->key:name:value
		KeyRange range = new KeyRange();
		range.setStart_key(strToBB(FromField));
		range.setEnd_key(strToBB(ToField));
		List<KeySlice> keys;
		try {
			keys = client.get_range_slices(new ColumnParent(ColumnFamily),
					Predicate, range, ConsistencyLevel.ONE);
			if (print) {
				for (KeySlice key : keys) {
					for (ColumnOrSuperColumn aColumn : key.getColumns()) {
						System.out.println(byteToStr(key.getKey()) + ":"
								+ byteToStr(aColumn.getColumn().getName())
								+ ":"
								+ byteToStr(aColumn.getColumn().getValue()));
					}
				}
			}
			return keys;
		} catch (InvalidRequestException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (UnavailableException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (TimedOutException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (TException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
}
 

将编译后的class文件导入VC工程下,配置jvm.dll到工程中,同时添加相关环境变量,以上过程略过

在VC工程中创建C++,实现虚拟机调用

#include <stdio.h>
#include <jni.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

int main() {
	// 定义用到的变量
	int res;
	JavaVM *jvm;
	JNIEnv *env;
	JavaVMInitArgs vm_args;
	JavaVMOption options[3];
	vm_args.version;
	
	// 设置初始化参数
	options[0].optionString = "-Djava.compiler=NONE";
	// classpath有多个时,用";"分隔,UNIX下以":"分割。
	options[1].optionString =
		"-Djava.class.path=.;D:\\apache-cassandra-1.0.0\\lib\\apache-cassandra-1.0.0.jar;D:\\apache-cassandra-1.0.0\\lib\\apache-cassandra-clientutil-1.0.0.jar;D:\\apache-cassandra-1.0.0\\lib\\apache-cassandra-thrift-1.0.0.jar;D:\\apache-cassandra-1.0.0\\lib\\commons-cli-1.1.jar;D:\\apache-cassandra-1.0.0\\lib\\commons-codec-1.2.jar;D:\\apache-cassandra-1.0.0\\lib\\antlr-3.2.jar;D:\\apache-cassandra-1.0.0\\lib\\avro-1.4.0-fixes.jar;D:\\apache-cassandra-1.0.0\\lib\\avro-1.4.0-sources-fixes.jar;D:\\apache-cassandra-1.0.0\\lib\\commons-lang-2.4.jar;D:\\apache-cassandra-1.0.0\\lib\\compress-lzf-0.8.4.jar;D:\\apache-cassandra-1.0.0\\lib\\concurrentlinkedhashmap-lru-1.2.jar;D:\\apache-cassandra-1.0.0\\lib\\guava-r08.jar;D:\\apache-cassandra-1.0.0\\lib\\high-scale-lib-1.1.2.jar;D:\\apache-cassandra-1.0.0\\lib\\jackson-core-asl-1.4.0.jar;D:\\apache-cassandra-1.0.0\\lib\\jackson-mapper-asl-1.4.0.jar;D:\\apache-cassandra-1.0.0\\lib\\jamm-0.2.5.jar;D:\\apache-cassandra-1.0.0\\lib\\jline-0.9.94.jar;D:\\apache-cassandra-1.0.0\\lib\\json-simple-1.1.jar;D:\\apache-cassandra-1.0.0\\lib\\libthrift-0.6.jar;D:\\apache-cassandra-1.0.0\\lib\\log4j-1.2.16.jar;D:\\apache-cassandra-1.0.0\\lib\\servlet-api-2.5-20081211.jar;D:\\apache-cassandra-1.0.0\\lib\\slf4j-api-1.6.1.jar;D:\\apache-cassandra-1.0.0\\lib\\slf4j-log4j12-1.6.1.jar;D:\\apache-cassandra-1.0.0\\lib\\snakeyaml-1.6.jar;D:\\apache-cassandra-1.0.0\\lib\\snappy-java-1.0.3.jar;";
	// 用于跟踪运行时的信息
	options[2].optionString = "-verbose:jni";
	// 版本号设置
	vm_args.version = JNI_VERSION_1_6;
	vm_args.nOptions = 3;
	vm_args.options = options;
	vm_args.ignoreUnrecognized = JNI_TRUE;
	// 1.初始化虚拟机
	res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
	if (res < 0)
	{
		fprintf(stderr, "Can't create Java VM\n");
		exit(1);
	}
	// 2.获取类
	jclass cls = env->FindClass("Cassandratest");
	// 3.获取类的方法
	jmethodID init= env->GetMethodID(cls,"init","()V");
	jmethodID end= env->GetMethodID(cls,"end","()V");
	//其中格式为 A Function(B b, C c)--->(BC)A
	//例如,String类型,写为Ljava/lang/String,若自定义类型,则写为Lyour.pack.yourClass
	//int类型写作I,空值返回写作(XXXX)V,返回值类型在括号右侧
	//Short类型写作S,等等
	jmethodID insertNewColumn= env->GetMethodID(cls,"insertNewColumn","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/apache/cassandra/thrift/Column;");
	// 获取Java的构造方法
	jmethodID con=env->GetMethodID(cls,"<init>","()V");
	jvalue arg[1];
	// 4.创建类的对象
	jobject obj = env->NewObjectA(cls,con,arg);
	// 调用对象的方法
	env->CallObjectMethod(obj,init);
	env->CallObjectMethod(obj,end);
	// 5.退出虚拟机
	jvm->DestroyJavaVM();
	fprintf(stdout, "Java VM destory.\n");
	return 0;
}
 以上方法能简单调用初始化方法,2011-11-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值