同样的应用 为什么 少少女前线卡在加载界面了 engin

USBKey使用openssl链接 - CSDN博客
USBKey使用openssl链接
Openssl对USBKey的研究
1.&&&&USBKey
USBKey是一种USB接口的硬件设备。它内置单片机或智能卡芯片,有一定的存储空间,可以存储用户的以及,利用USB
Key内置的实现对用户身份的认证。由于用户私钥保存在密码锁中,理论上使用任何方式都无法读取,因此保证了的安全性。
2.&&&&Openssl
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的、常用的和证书封装管理功能及协议,并提供丰富的应用程序供测试或其它目的使用。
是Secure Sockets Layer()的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为上保密通讯的工业标准。
SSL能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的协议()之上。SSL协议的优势在于它是与协议独立无关的,高层的应用层协议(例如:,,等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成、通信的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
Openssl的知识不是一下两下能说完的,后面再详细解释openssl的具体功能,这里直接切入正题,看看openssl是怎么驱动USBKey的。
3.&&&&Openssl引擎
Engine机制目的是为了使OpenSSL能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。OpenSSL的Engine机制成功地达到了这个目的,这使得OpenSSL已经不仅仅使一个加密库,而是提供了一个通用地加密接口,能够与绝大部分加密库或者加密设备协调工作。当然,要使特定加密库或加密设备更OpenSSL协调工作,需要写少量的接口代码,但是这样的工作量并不大,虽然还是需要一点密码学的知识。Engine机制的功能跟Windows提供的CSP功能目标是基本相同的。
4.&&&&Engine-pkcs11
engine_pkcs11是opensc开源工程开发的PKCS#11的一个引擎,可以直接支持openssl。利用它可以实现openssl和USBKey的接口。
Openssl加载engine-pkcs11引擎库的时候要调用engine_pkcs11源码中的bind_fn函数,来设置一些参数,具体代码如下所示:
if (!ENGINE_set_id(e, PKCS11_ENGINE_ID) ||
&&&&&&&& &&& !ENGINE_set_destroy_function(e,pkcs11_engine_destroy) ||
&&&&&&&& &&& !ENGINE_set_init_function(e, pkcs11_init)||
&&&&&&&& &&& !ENGINE_set_finish_function(e,pkcs11_finish) ||
&&&&&&&& &&& !ENGINE_set_ctrl_function(e,pkcs11_engine_ctrl) ||
&&&&&&&& &&& !ENGINE_set_cmd_defns(e, pkcs11_cmd_defns)||
&&&&&&&& &&& !ENGINE_set_name(e, PKCS11_ENGINE_NAME) ||
#ifndef OPENSSL_NO_RSA
&&&&&&&& &&& !ENGINE_set_RSA(e, PKCS11_get_rsa_method())||
#ifndef OPENSSL_NO_DSA
&&&&&&&& &&& !ENGINE_set_DSA(e,DSA_get_default_method()) ||
#ifndef OPENSSL_NO_DH
&&&&&&&& &&& !ENGINE_set_DH(e, DH_get_default_method())||
&&&&&&&& &&& !ENGINE_set_RAND(e, RAND_SSLeay()) ||
&&&&&&&& &&& !ENGINE_set_BN_mod_exp(e, BN_mod_exp) ||
&&&&&&&& &&& !ENGINE_set_load_pubkey_function(e,pkcs11_load_public_key) ||
&&&&&&&& &&& !ENGINE_set_load_privkey_function(e,pkcs11_load_private_key) ) {
&&&&&&&&&&&&&&&&& return 0;
&&&&&&&& } else {
&&&&&&&&&&&&&&&&& return 1;
&&&&&&&& }
主要包括引擎初始化,主要是初始化一些回调函数,包括导入私钥、导入公钥、导入证书。由于这里没有导入证书的接口,所以需要增加一个导入证书的接口函数,增加如下代码:
!ENGINE_set_load_ssl_client_cert_function(e,load_ssl_client_cert)
其中load_ssl_client_cert是导入证书,这个函数源码中没有实现需要自己实现。后面着重实现这部分代码。
5.&&&&实现
& 这是openssl对USBKey实现的步骤,他采用openssl引擎的机制来调用USBKey的接口实现证书的认证等一系列过程。本次采用的USBKey为海泰生产的USBKey。在这里介绍一下怎么样使用USBKey通过openssl和服务器进行ssl链接。
首先启动openssl。启动的时候用root用户来启动。否则在操作USBKey设备的时候会失败。
第二、加载引擎,这里的引擎使用engine-pkcs11提供的引擎方法。这里的引擎有个接口方法没有实现,需要自己来实现这个接口。后面再解释。加载引擎的方法为:
engine -t dynamic -pre SO_PATH:/usr/local/lib/engines/engine_pkcs11.so-pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -preMODULE_PATH:/home/wuyan/rockontrol/haikey.RAR/haikey-0.2.4/lib/htpkcs11.so
其中SO_PATH为pkcs11的引擎,ID为引擎的id,就是后面调用引擎的名字。MODULE_PATH为USBKey的驱动,也就是USBKey的接口函数。结果如下:
(dynamic) Dynamic engine loading support
[Success]:SO_PATH:/usr/local/lib/engines/engine_pkcs11.so
[Success]: ID:pkcs11
[Success]: LIST_ADD:1
[Success]: LOAD
[Success]:MODULE_PATH:/home/wuyan/rockontrol/haikey.RAR/haikey-0.2.4/lib/htpkcs11.so
Loaded: (pkcs11) pkcs11 engine
&&&&[ available ]
如果是available说明你的引擎调用成功了。
第三就是进行ssl链接,openssl的s_client工具实现了简单的ssl连接。可以通过它来做ssl链接的测试。在和服务器进行ssl链接的时候,需要读取USBKey中的公钥、私钥和证书。为了使用第二步加载的引擎,需要使用engine参数来指名引擎的id,引擎的id在第二步已经设置过为pkcs11,engine-pkcs11引擎中为了找到对应的证书需要提供一个USBKey对应的id号。通过key参数来指定。有了这两个参数就可以通过openssl引擎正确读取USBkey的公钥和私钥了,但是还不能正确的获取证书,获取证书在openssl中必须通过ssl3协议进行ssl链接。所以需要指定ssl3参数。然后指定client_engine
pkcs11这个参数就是指定导入客户端证书的回调函数。也就是在上面实现的load_ssl_client_cert,在进行ssl连接的时候需要导入证书,否则失败。然后用s_client测试就可以。命令如下:
s_client -engine pkcs11& -key id_ebda8c5deca3dad981f& -keyform engine -ssl_client_engine pkcs11-ssl3 -connect ***.***.***.***:443
6.&&&&获取证书的实现
& 在第四节的时候我们在引擎中增加了一个获取证书的接口,它在engine_pkcs11中没有实现,这里我们就介绍一下他的实现。首先我们先看openssl是怎么获取证书的,因为我们是用ssl3协议进行连接,在s3_clnt.c文件中int ssl3_send_client_certificate(SSL *s)函数中有ssl_do_client_cert_cb(s,&x509, &pkey)函数,次函数就是要获取客户端证书。他会调用ENGINE_load_ssl_client_cert(s-&ctx-&client_cert_engine,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& SSL_get_client_CA_list(s),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& px509,ppkey, NULL, NULL, NULL);
e-&load_ssl_client_cert(e, s, ca_dn,pcert, ppkey, pother,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ui_method,callback_data);
这就是我们上面所设置的回调函数。从上面可以看出我们只需要&x509, &pkey这两个东西,所以在回调函数中就是要获取这两个东西。好在engine_pkcs11已经提供了这两个函数的接口。贴代码吧:
int load_ssl_client_cert(ENGINE *e, SSL *ssl,
&&&&&&&& STACK_OF(X509_NAME)*ca_dn, X509 **pcert, EVP_PKEY **pkey,
&&&&&&&& STACK_OF(X509)**pother, UI_METHOD *ui_method, void *callback_data)
&&&&&&&& {
&&&&&&&&&&&&&&&&& *pcert= pkcs11_load_cert(e, &ebda8c5deca3dad981f&);
&&&&&&&&&&&&&&&&& if(*pcert == NULL)
&&&&&&&&&&&&&&&&&&&&&&&&& return0;
&&&&&&&&&&&&&&&&& *pkey= pkcs11_load_key(e, &ebda8c5deca3dad981f&,NULL, NULL, 0);
&&&&&&&&&&&&&&&&& if(*pkey == NULL)
&&&&&&&&&&&&&&&&&&&&&&&&& return0;
&&&&&&&&&&&&&&&&& return1;
&&&&&&&&&&&&&&&&&
&&&&&&&& }
其中ebda8c5deca3dad981f为USBKey的id号,当然也可以自动去USBKey中读取。其中pkcs11_load_cert和pkcs11_load_key都可以在engine_pkcs11引擎中找到原形。然后重新编译使用吧。
先学到这里,后面继续优化。下一章介绍ssl链接的流程
本文已收录于以下专栏:
相关文章推荐
原文:What Everyone Should Know About Machine Learning
作者:Gero Presser
翻译:雁惊寒
摘要:本文科普了机器学习方面的知识,简...
本文来自作者在GitChat(ID:GitChat_Club)上分享「如何学习分布式系统?」,CSDN独家合作发布。
分布式系统在互联网公司中的应用已经非常普遍,开源软件层出不穷。had...
本文主要涵盖了 Python 编程的核心知识,按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字符串,列表,元组,字典,集合),条件&循环,文件对象,错误&异常,函数,模块,面向对...
OpenSSL项目是一个开放源代码安全项目,它的目标是开发一个健壮的、商业级的、完整的开放源代码的工具包,用强大的加密算法来实现安全的Socket层(Secure
BOOL _ReadFile(LPCSTR FilePath, BYTE *FileContent, DWORD *FileLength)
FILE *stream = NULL;...
Quick Start
Please first install the PKCS#11 Module you want to use such as OpenSC, and install lib...
1.执行解压命令tar xvzf ./opensll-1.0.0s.tar.gz,解压后进入文件夹.
2.mkdir _install 创建一个_install文件夹
3.执行命令 
用SSL进行双向身份验证意思就是在客户机连接服务器时,链接双方都要对彼此的数字证书进行验证,保证这是经过授权的才能够连接(我们链接一般的SSL时采用的是单向验证,客户机只验证服务器的证书,服务器不验证...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)OPENSSL ENGINE机制 - CSDN博客
OPENSSL ENGINE机制
项目是一个开放源代码安全项目,它的目标是开发一个健壮的、商业级的、完整的开放源代码的工具包,用强大的加密算法来实现安全的层(,)和传输层的安全性(,)。它包含了完整的加密算法,数字签名算法及证书算法等。可以很好地保证数据的完整,保密和正确性。可以和于商业用途,但是使用者应该考虑自己所使用的算法有没有受到本国专利的限制以及考虑是否符合国家制定的标准。
机制Engine机制的出现是在的版的事情,开始的时候是将普通版本跟支持的版本分开的,到了的版,机制集成到了的内核中,成为了不可缺少的一部分。
机制目的是为了使能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。的机制成功地达到了这个目的,这使得已经不仅仅使一个加密库,而是提供了一个通用地加密接口,能够与绝大部分加密库或者加密设备协调工作。当然,要使特定加密库或加密设备更协调工作,需要写少量的接口代码,但是这样的工作量并不大,虽然还是需要一点密码学的知识。机制的功能跟提供的功能目标是基本相同的。
目前,的版本支持的内嵌第三方加密设备有种,包括:、、、、、、以及的硬件加密设备。现在还出现了支持接口的接口,支持微软的接口也有人进行开发。当然,所有上述接口支持不一定很全面,比如,可能支持其中一两种公开密钥算法。表是版本支持的硬件及其对应的简要描述名称,这个简要描述名称在很多时候是要使用的,如编程或执行命令的时候,简要密钥名称是大小写敏感的,目前一般都是采用小写字符。
OpenSSL支持的Engine接口
Engine接口描述
动态加载Engine设备的接口
CryptoSwift的硬件加密设备Engine支持
nChipher硬件加密设备Engine支持
Atalla硬件加密设备Engine支持
Nuron硬件加密设备Engine支持
UBSEC硬件加密设备Engine支持
Aep硬件加密设备Engine支持
SureWare硬件加密设备Engine支持
IBM 4758 CCA硬件加密设备Engine支持
ENGINE是OPENSSL预留的用以加载第三方加密库引擎,主要包括了动态库加载的代码和加密函数指针管理的一系列接口。如果要使用Engine(假设你已经加载上该Engine了),那么首先要加载该Engine(比如ENGINE_load_XXXX),然后选择要使用的算法或者使用支持的所有加密算法(有相关函数)。这样你的应用程序在调用加解密算法时,它就会指向你加载的动态库里的加解密算法,而不是原先的OPENSSL的库里的加解密算法。
上面提到的一些engine的实现在 openssl/crypto/engine/目录下可以找到,来分析一下具体的实现:
首先,每一个ENGINE_load_XXXX其实就是一个Engine的加载过程:
ENGINE_load_rtl8651b(void)
ENGINE *engine = ENGINE_new();
if (engine == NULL)
&&&&&&&&&&&&&&&
if (!ENGINE_set_id(engine, &rtl8651b&) ||
&&&&&&&&&&&
!ENGINE_set_name(engine, &BSD rtl8651b engine&) ||
&&&&&&&&&&&
!ENGINE_set_ciphers(engine, rtl8651b_engine_ciphers)||
&&&&&&&&&&&
!ENGINE_set_digests(engine, rtl8651b_engine_digests)||
&&&&&&&&&&&
!ENGINE_set_ctrl_function(engine, rtl8651b_ctrl) ||
&&!ENGINE_set_cmd_defns(engine, rtl8651b_defns)
&&&&&&&&&&&&&&&
ENGINE_free(engine);
&&&&&&&&&&&&&&&
if(!ENGINE_set_default(engine, ENGINE_METHOD_DIGESTS) )
ENGINE_add(engine);
ENGINE_free(engine);
ERR_clear_error();
类似ENGINE_set_xxxx的函数是对engine机制各个方面的设定注册,有下面这些:
int ENGINE_set_id(ENGINE *e, const char *id);
int ENGINE_set_name(ENGINE *e, const char *name);
int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth);
int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth);
int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth);
int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth);
int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f);
int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f);
int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f);
int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f);
int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f);
int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f);
int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f);
int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f);
int ENGINE_set_flags(ENGINE *e, int flags);
int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns);
由此可知,具体的(,,,,,)算法实现主要是这些函数实现的。
以DIGESTS为例:首先要声明一个对应的数据结构(MD5):
const EVP_MD rtl8651b_hash_md5={
NID_md5WithRSAEncryption,
&MD5_DIGEST_LENGTH,
rtl8651b_digest_init,
rtl8651b_digest_update,
rtl8651b_digest_final,
EVP_PKEY_RSA_method,
MD5_CBLOCK,
sizeof(RTL_DIGEST_CTX)/* how big does the ctx-&md_data need to be */
具体的各项的含义,请参考EVP_MD数据结构。
这里rtl8651b_digest_init, rtl8651b_digest_update, rtl8651b_digest_final,就是具体的算法实现。
如果都完成了,则可以调用动态库中的ENGINE_load_XXXX(例子中是ENGINE_load_
rtl8651b),把ENGINE对象加载到系统中,即在ENGINE对象和DIGESTS的结构里的ENGINE对象建立了一个关联,使用这种方法,使ENGINE能够智能的判断是使用自定义的加解密算法,还是使用默认的加解密算法。
ENGINE_load_ rtl8651b中,我们可以使用下面的方法来使用你所定义的算法。
ENGINE_set_default(ENGINE *e, int Flag)
其中Flag的说明如下:
ENGINE_METHOD_ALL
使用所有存在的算法(默认)
ENGINE_METHOD_RSA
仅使用RSA算法
ENGINE_METHOD_DSA
仅使用DSA算法
ENGINE_METHOD_DH
仅使用DH算法
ENGINE_METHOD_RAND
仅使用随机数算法
ENGINE_METHOD_CIPHERS
仅使用对称加解密算法
ENGINE_METHOD_DIGESTS
仅使用摘要算法
ENGINE_set_default(engine, ENGINE_METHOD_DIGESTS)
上面给出使用ENGINE有效替换OPENSSL中现有的所有的加密算法,使用这个特性也可以很好的加入一些OPENSSL中所没有的加解密算法,这使开发加解密算法的应用程序更加简便,相对于传统的开发方法是一个有效稳妥的方法。
本文已收录于以下专栏:
相关文章推荐
engine在openssl中是一个重要的概念,它提供了一种重载默认算法的方式,首先看一下engine结构体:struct engine_st {        const char *   &...
注:这是一篇多年以前写的文章了。现在记录在这儿供大家参考吧 
【摘要】本文介绍了OpenSSL Engine、CSP的原理及Windows CryptoAPI。分析了OpenSSL Engine实现...
openssl简介
openssl是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有:SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对...
一:ENGINE的目的:
ENGINE是OPENSSL预留的加载第三方加密库,主要包括了动态库加载的代码和加密函数指针管理的一系列接口。如果要使用Engine(假设你已经加载上该Engine了),那么...
Engine机制 Engine机制的出现是在OpenSSL的0.9.6版的事情,开始的时候是将普通版本跟支持Engine的版本分开的,到了OpenSSL的0.9.7版,Engine机制集成到了Open...
Openssl对USBKey的研究
1.    USBKey
USBKey是一种USB接口的硬件设备。它内置单片机或智能卡芯片,有一定的存储空间,可以存储用户的私钥以及数字证书,利用USB
众所周知 openssl是一个用c 语方实现的开源加密库。所以一般情况下,大家也习惯于迁就openssl的这一习惯,在实现engine的时候,总是优先选择c语言来实现。但是c++也是不错的。采用c++...
NAMEengine - ENGINE cryptographic module support SYNOPSIS #include
ENGINE *ENGINE_get_first(void); ...
原文:/adylee/archive//1537813.html
1.1   What to do
通过Openssl和...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Java调用R,就是使用JRI.jar中的Api;1.JRI中主要的API;RengineR引擎,通过它进行R语言的启动、运;Rengineengine=newRengine;Rengine.versionCheck()//;engine.waitForR()//R加载校验;engine.end()//结束R,在后续没有调;R计算结果表达式;REXPrexp
Java调用R,就是使用JRI.jar中的Api,执行一条R语言命令,当然首先你要了解R语言的语法。
1.JRI中主要的API Rengine R引擎,通过它进行R语言的启动、运算、画图、关闭等功能。 一个线程只能实例化一次,推荐使用单例模式。 实例化代码: Rengine engine = new Rengine(null,false,null); Rengine.versionCheck() //R版本校验,返回true:版本校验通过 返回false:版本校验未通过 engine.waitForR() //R加载校验,返回true:加载成功 返回false:加载失败 engine.end() //结束R,在后续没有调用R的情况下使用,否则R将退出,不能继续使用R。
2.REXP R计算结果表达式 REXP rexp = engine.eval_r(String str) //执行R命令,返回结果REXP rexp.asInt() rexp.asDouble() rexp.as.. //将REXP转成java类型 engine.assign(String name,double d) //定义R变量,name为R中变量的名字
以上大概了解了JRI的基本API,下面写个简单的例子。 //求n个数的最大值 Rengine engine = new Rengine(null,false,null); int[] arr = new int[]{-1,2,1,-3,5,4,-2}; engine.assign(\REXP rexp = engine.eval_r(\int max = rexp.asInt(); System.out.println(max);
太好了,一个简单的例子完成了,我们来试一下吧! 不好意思,这样程序还不能运行,Java调用R需要一个启动参数://应该就是环境变量 -Djava.library.path=\加上这个启动参数后,终于OK了。
做到这里Java调用R的第一步也是最重要的一步终于完成了。Congratulations! 这只是个简单的例子,在实际使用中可以使用R中较复杂的函数进行统计,个人建议对R的操作封装为一个工具类,以免对唯一的Rengine实例进行了误操作,导致程序整体崩溃。
R与JAVA的整合 R是统计计算的强大工具,而JAVA是做应用系统的主流语言,两者天然具有整合的需要。关于整合,一方面,R中可以创建JAVA对象调用JAVA方法,另一方面,JAVA中可以转换R的数据类型调用R的函数,互相取长补短。现在也有一个项目JGR,用JAVA做R的图形界面,可以实现高亮显示自动补全等,还能让JAVA和R互相调用。
关于R中调用JAVA,我想主要是为了利用其面向对象的特性,毕竟R语言近来很致力于向面向对象发展,有个很好的项目rJava可以实现,在www.rforge.net/rJava上。R中调JAVA对我似乎意义不大,本文主要介绍JAVA中调用R。所有测试都在Windows XP、R2.10.1和JDK1.6下完成。
JAVA很适合开发应用系统,但是数学建模和计算能力非其所长,如果该系统需要进行大量的统计或者优化的计算,调用R是一种很好的方式。JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统。
首先要介绍的是Rserve的方式,这是一个基于TCP/IP的服务器,通过二进制协议传输数据,可以提供远程连接,使得客户端语言能够调用R。目前Rserve作为一个package发布在CRAN上,可以直接使用install.packages(\进行安装。需要使用时在R控制台下加载该包,然后输入命令Rserve(),开启服务器,就可以供客户端调用。
其客户端可以有多种,这里只介绍JAVA客户端。最早的客户端包是JRclient,在www.rosuda.org/Rserve上还可以下载到,但是现在该项目全部移到了www.rforge.net/Rserve,使用REngine作客户端(和JRI一致),在该网站下可以下载到REngine.jar和RserveEngine.jar两个文件。如果用eclipse开发的话,在工程属性中导入这两个外部的jar包,就可以正常使用了。
一个简单的例子: [java] view plain copy print? 1. 2. 3. 4. 5. 6. 7. 8.
public class rtest {
public static void main(String[] args) throws REXPMismatchException, REngineException {
RConnection c = new RConnection();
REXP x = c.eval(\);
System.out.println(x.asString());
另一种方式是JRI,全名是Java/R Interface,这是一种完全不同的方式,通过调用R的动态链接库从而利用R中的函数等。目前该项目已经成了rJava的子项目,不再提供单独的JRI的版本。因此使用时简单地通过install.packages(\安装rJava就行,在安装文件夹中,可以看到一个jri的子文件夹,里面有自带的例子可以用来测试。
装好后要修改系统的环境变量,在PATH中添加%R_HOME%bin和%R_HOME%libraryrJavajri,注意R_HOME的路径要正确,重启系统使之生效。使用时同样在eclipse里导入外部的jar包(在www.rforge.net/rJava下载JRI.jar、REngine.jar和JRIEngine.jar这三个文件),在rJava包安装目录下的jriexamples里有现成的例子(rtest.java和rtest2.java),可以测试是否成功。
之前我的电脑上一直存在一个很奇怪的问题,测试第一个例子时在“Creating Rengine (with arguments)”的时候就停住了,第二个例子中一个JAVA框很快闪一下就消失了,控制台中没有任何提示。打开JGR也是一闪即逝。在网上查了很久,只有一个印度哥们也遇到过类似的问题,而且没有找到解决办法。估计应该是实现RMainLoopCallbacks时出了问题,但是找不到原因,后来卸载了R2.9.0重装了R2.10.1,并且通过install.packages安装,终于没问题了,可能是主程序和Package之间的版本冲突,以后记住全部用install.packages来安装package了。
关于客户端服务器的方式和动态链接库的方式,各有所长,按照需要选用。个人经验,不管使用哪种方式,设计时尽量少进行频繁的数据的交互,在逻辑上把系统和计算分开,使得R成为一个纯粹的运算引擎。
Eclipse JRI : Java 调用 R 报错: Cannot find JRI native lib
Eclipse JRI : Java 调用 R 报错: Cannot find JRI native library!
具体的解决方法如下: R_HOME = C:\\Program Files\\R\\R-2.15.0 ( R 的安装主目录) RJAVA_HOME = C:\\Program Files\\R\\R-2.13.0\\library\\rJava (RJava 的安装目录) PATH = %PATH%;%RJAVA_HOME%\\jri\\x64;%RJAVA_HOME%\\%R_HOME%\\bin\\x64; (环境变量) 另,选择i386,还是x64――根据您的实际情况决定!!! 32电脑i386 备注:可以通过Java直接在 Eclipse里面把 java.library.path 打印出来――确认JRI native library! 的文件路径是正确配置的 System.out.println(System.getProperty(\终于调试成功啦!
Java调用R(二)_JRI
R中需要安装rJava包。 2.
系统变量Path加上 C:\\Program Files\\R\\R-3.0.1\\bin\\i386;C:\\Program Files\\R\\R-3.0.1\\library\\rJava\\jri
系统变量Classpath加上: C:\\Program Files\\R\\R-3.0.1\\library\\rJava\\jri\\JRI.jar 3.
项目中加入JRI.jar, JRIEngine.jar, REngine.jar 4.
将rJava自带的测试实例,加入项目测试,执行成功。配置完成。 5.
Java本地测试(项目test/rtest.java以及 test/TestDLL.java)
C:\\Program Files\\R\\R-3.0.1\\library\\rJava\\jri\\examples\\有rJava自带的实例
R脚本分条执行,基本语法同Rserve. for循环时需要java变量和R变量的转换。
6. Java Web的lib目录下加入JRI.jar, JRIEngine.jar, REngine.jar
C:\\Program Files\\R\\R-3.0.1\\library\\rJava\\jri\\i386\\jri.dll放入Java Path中或者Tomcat bin目录中(就是将jri.dll放入java web项目的classpath 中)
利用自带实例rtest中的TextConsole方式实例化Rengine对象
class TextConsole implements RMainLoopCallbacks{}
Rengine re=new Rengine(args, false, new TextConsole());
经个人测试,在项目中多次调用Rengine re=new Rengine(args, false, new TextConsole()); 会在第二次报错。 三亿文库包含各类专业文献、文学作品欣赏、幼儿教育、小学教育、高等教育、外语学习资料、生活休闲娱乐、应用写作文书、中学教育、各类资格考试、行业资料、java调用R软件实现数据分析引擎集成46等内容。 
 java大数据处理_计算机软件及应用_IT/计算机_专业...CsvAction,生成 csv 文件,并且将生成的 csv 文件...写完一行需要回车换行&\r\n& String title = &...  java调用Weka中神经网络的算法(从数据库中取数据)_计算机软件及应用_IT/计算机_...(0);//设置训练数据集的类属性,即对哪个数据列 进行预测(属性的下标从 0 ...  java调用R软件实现数据分析引擎集成_计算机软件及应用_IT/计算机_专业资料。java调用R语言实现数据分析引擎集成,可用于时间序列分析、时间序列分解、聚类等 ...  方法,另一方面,JAVA 中可以 转换 R 的数据类型调用 R 的函数,互相取长补短...JAVA 负责系统的构建,R 用来做 运算引擎,从而实现应用型和分析性相结合的系统...  数据挖掘关联性分析小软件Java源程序代码_IT/计算机_专业资料。详细Java源程序代码,,,可跑,,,绝对给力今日推荐 120份文档 2014年细分行业研究报告年度盘点 ...  使用Java原生代理实现数据注入_计算机软件及应用_IT/...代码分析:通过代码里标识的元数据对代码进行分析【...().getIntewww.baiyuewang.netrfaces(), new AOP...  原生的非 Java 版本主要是为了分析农业领域数据而...R 编写的,这是一款针对编程语言和软件环境进行统计...同样也是一个数 据挖掘引擎可以用来集成到你的产品...  Java 开发分析大数据_计算机软件及应用_IT/计算机_...Hadoop 提取出了 MapReduce 的大规模数据分析引擎,更...r----2010 ...

我要回帖

更多关于 wallpaper engin 的文章

 

随机推荐