读书人

VC环境上利用JNI调用Java类连接Cassan

发布时间: 2012-09-28 00:03:35 作者: rapoo

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 stubKEYSPACE = 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 blocke1.printStackTrace();}if (!isOpen) {try {transport.open();client.set_keyspace(KEYSPACE);System.out.println("Opening...OK");} catch (TTransportException e) {// TODO Auto-generated catch blockSystem.out.println("Network is unreachable...");} catch (InvalidRequestException e) {// TODO Auto-generated catch blockSystem.out.println("请求无效");} catch (TException e) {// TODO Auto-generated catch blocke.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 blockSystem.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 blocke.printStackTrace();return null;} catch (UnavailableException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} catch (TimedOutException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} catch (TException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();return null;} catch (NotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} catch (UnavailableException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} catch (TimedOutException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} catch (TException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();return null;} catch (UnavailableException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} catch (TimedOutException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} catch (TException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;}}@SuppressWarnings("unused")private List<KeySlice> ListFieldValue(String ColumnFamily,String FromField, String ToField, SlicePredicate Predicate,boolean print) {// check all range--->key:name:valueKeyRange 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 blocke.printStackTrace();return null;} catch (UnavailableException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} catch (TimedOutException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} catch (TException e) {// TODO Auto-generated catch blocke.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

读书人网 >其他数据库

热点推荐