Java JNI 调用C++ API及中文编码问题

上一篇 / 下一篇  2012-08-10 10:17:05 / 个人分类:Java

)H1pRM6h0z#W1k0  Java调用C++可以通过JNI声明native方法进行调用,主要步骤有:51Testing软件测试网b2s&n _a k*u4}\

51Testing软件测试网;?Y,R4KxGQ;{

  1、声明类及相关nativ方法,加载要调用的C++库51Testing软件测试网o$s2x(i3r$P7\_-yZ

51Testing软件测试网li y d:cGw

package bupt.cist.nlp.ner;51Testing软件测试网3K,]5T)]5h

51Testing软件测试网g$D{)^Lft@i

public class ChineseNER {51Testing软件测试网C8d#B'K{1yl&pv
 static{51Testing软件测试网3j7AG;~ AC
  System.loadLibrary("CIST_NER");51Testing软件测试网1iR!T}gx
 }51Testing软件测试网B*?!bJ1D,sQAJ
 public ChineseNER(){
gJAe,?PWY0 }51Testing软件测试网x,F_`f V:q7R1P i(?
 public native void say(String msg);
jC.k)d1x x W/M3Y0 public native String process(String line);
.`dmse1k*_0}

SDu,~~&|0

?U'L,jrS;Q0  2、到源码目录下,通过命令javah -jni bupt.cist.nlp.ner.ChineseNER编译类,生成.h头文件

'j t y.V#Z4H4U051Testing软件测试网|G%},dqL

/* DO NOT EDIT THIS FILE - it is machine generated */51Testing软件测试网 G3B i0_p*t5mWF
#include "jni.h"51Testing软件测试网7L}r/Pj)st1@7J
/* Header for class bupt_cist_nlp_ner_ChineseNER */
51Testing软件测试网;U}_0jL

+Y"CMOw3Q/M;bS#v0#ifndef _Included_bupt_cist_nlp_ner_ChineseNER51Testing软件测试网3U'HJ i^#EN mmB
#define _Included_bupt_cist_nlp_ner_ChineseNER
h o#Z2N3Q&{^0#ifdef __cplusplus51Testing软件测试网M5bQ*B an
extern "C" {
9^3d!xOW#v1|zH0#endif
;}-z4yPVK}+`E0/*
O2_J UI"H1VT.OB0 * Class:     bupt_cist_nlp_ner_ChineseNER51Testing软件测试网X2S7W t Qk.]Wk$B&N
 * Method:    say51Testing软件测试网DIz*}.v#h
 * Signature: (Ljava/lang/String;)V
VdD0IR;p|3k0 */51Testing软件测试网2xEv4XU]
JNIEXPORT void JNICALL Java_bupt_cist_nlp_ner_ChineseNER_say51Testing软件测试网S[-Q y,a,mH
  (JNIEnv *, jobject, jstring);

HD~eZ"C0

;WHusCU|teM0/*51Testing软件测试网$i IW&b8kAf@
 * Class:     bupt_cist_nlp_ner_ChineseNER
7d` t9K:L&CR r)BQ0 * Method:    process51Testing软件测试网BHW1D o
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
+j;Z"FZ.Le3F0 */
n2W` kk%R&~p4c0JNIEXPORT jstring JNICALL Java_bupt_cist_nlp_ner_ChineseNER_process
4n _IX9[7^o/A0  (JNIEnv *, jobject, jstring);

J @ L*X{Z0

E0J#j i J0#ifdef __cplusplus51Testing软件测试网kK%N5?7S7T R
}51Testing软件测试网z&B"P qva$['x
#endif51Testing软件测试网-TvVyY.v3}
#endif
51Testing软件测试网cT9^$H `

\^7| o%[Ca4A:@0  3、新建CIST_NER的dll工程,加载.h头文件,编写cpp文件实现dll库51Testing软件测试网 D,W5kT;q T%Eq

51Testing软件测试网^+I3{ @?}pp j

G@2nh L;O%~E@3WK5?0
51Testing软件测试网u7FR)G6H/|,o

#include <iostream>51Testing软件测试网wG&hk!_d sT
#include <string>
l}"c7hcd0#include "bupt_cist_nlp_ner_ChineseNER.h"
_+o0gl2G6}2A;E0#include "windows.h"
51Testing软件测试网8I*Pbt/v3\'b

]V7k'I5`0using namespace std;51Testing软件测试网5q#h3C)e h7]2Yo

IS7~]!ii YSu ]'n p0char* jstringToWindows( JNIEnv *env, jstring jstr ) 51Testing软件测试网t7vL&J:c%KRF

,X5S)\J3Al0  int length = env->GetStringLength(jstr); 
UF5w-[[ _L8W$N WX"mW0  const jchar* jcstr = env->GetStringChars(jstr, 0); 
,vpi/STu$_0  char* rtn = (char*)malloc(length*2+1); 51Testing软件测试网 oVb*r7b/N$u9lX
  int size = 0; 51Testing软件测试网-G9bZ&y"r
  size = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL); 
h [C])n9WH,?R0  if( size <= 0 ) 51Testing软件测试网#@7X9Ki6^'i N7w
    return NULL; 
jB ` u:oj'~G[0  env->ReleaseStringChars(jstr, jcstr); 51Testing软件测试网g7M.Kpb*Y
  rtn[size] = 0; 
'f(x!n0^mS+^"_+l0  return rtn; 51Testing软件测试网Maf&[#X*]'o'Aw
51Testing软件测试网 Qqxz4^f;V+vy
jstring WindowsTojstring( JNIEnv *env, const char* str ) 51Testing软件测试网K8Xk`0j4p6e
51Testing软件测试网r*Y:[&`d"k!o
  jstring rtn = 0; 
e7e.GC3EZ}_0  int slen = strlen(str); 51Testing软件测试网2tFp0PD}ND&T
  unsigned short* buffer = 0; 
qs wl+Jk0  if( slen == 0 ) 51Testing软件测试网$sQob7a0nD2~
    rtn = env->NewStringUTF(str);  51Testing软件测试网_a3qN^L {
  else 51Testing软件测试网)} lItH1rf
  { 51Testing软件测试网8y&t(@;sA `O
    int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str, slen, NULL, 0); 
!e|JKf!M0    buffer = (unsigned short*)malloc(length*2 + 1); 
DMy1B i/Tt0    if( MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length) >0) 
fa$T` \l*|M x0      rtn = env->NewString((jchar*)buffer, length); 
'np^6jM0  } 51Testing软件测试网)|6O/_gN&y R VH
  if(buffer) 51Testing软件测试网7iv{ ]S(Z!@P$h
  free(buffer); 51Testing软件测试网 {:^2s(gW-LX(u X/S
  return rtn; 51Testing软件测试网#?re{0[a
51Testing软件测试网"E ] C5`,y
char* U2G(const char* utf8)
r9DWy'N8E/y0{51Testing软件测试网8A9s7d2l7v5M8@
  int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);51Testing软件测试网2C t*I ]H+k
  wchar_t* wstr = new wchar_t[len+1];51Testing软件测试网W;Hv#A f&w.Tb
  memset(wstr, 0, len+1);
A&OAO~}D0  MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);51Testing软件测试网,A.F\F2sVla2odA"S
  len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
'k!Ux?^8]0  char* str = new char[len+1];51Testing软件测试网[8W mi\.U6oS
  memset(str, 0, len+1);
GHh Gge0z0  WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
1C2znA)?,}Z0  if(wstr) delete[] wstr;
krw7N:S0  return str;
4B-\if:q5j#n0}
[/y0A1UU$yn U0char* G2U(const char* gb2312)51Testing软件测试网` qG-G)l w&}
{
n.K8a&]8z Q0  int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
Q4ipkz*l1S0  wchar_t* wstr = new wchar_t[len+1];
$A2B#l6Ara"Wu1z0  memset(wstr, 0, len+1);
)? v4xM$Y9T~ _3v0  MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);51Testing软件测试网 Q uE0MF
  len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);51Testing软件测试网-A:f(ne8~-?
  char* str = new char[len+1];
u[4` C0o7Z m0  memset(str, 0, len+1);51Testing软件测试网)p1{)\"Ig1[$dV/E
  WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
;n#u:[]3H0  if(wstr) delete[] wstr;
oH%z2m{ Q*GD0  return str;
`7wR5rP0}51Testing软件测试网h(P D O6q3@
JNIEXPORT void JNICALL Java_bupt_cist_nlp_ner_ChineseNER_say(JNIEnv *env, jobject obj, jstring msg)
}tc$S(F/k0{51Testing软件测试网 B7|g|X n!D"mn|#J
 const char* pmsg = env->GetStringUTFChars(msg, NULL);
'j*w'Cjo9? P0 cout << pmsg << endl;51Testing软件测试网R;h?s[6@\~!n
}51Testing软件测试网t)TMY cJ^
JNIEXPORT jstring JNICAL Java_bupt_cist_nlp_ner_ChineseNER_process(JNIEnv *env, jobject obj, jstring line)
bt Y?Ot3qX0{51Testing软件测试网#Z9M}*\#R
 const char* pmsg = jstringToWindows(env, line);
*h"SS5G[/v ?0 cout << pmsg << endl;51Testing软件测试网Y%Tf2P i
 // process51Testing软件测试网1IU,W;s;ZR1p9w
    return WindowsTojstring(env, res.c_str());
#u-di HdTH0}
51Testing软件测试网AZp`3[

51Testing软件测试网(R M e] MW+? QXB

  4、编译生成dll库,放在java工程目录下即可调用

4YD%Re1s051Testing软件测试网-|{ j!ME\$c

*S,K Zq{051Testing软件测试网w'^&}M/E?H

package cpp;51Testing软件测试网Z*_1CQG b

DS doNA,ixL%n0import bupt.cist.nlp.ner.*;
/p,^n:h ZDPq0public class test {

$W AGj9sK051Testing软件测试网i{L,jOHm

 /**
5Y rW k/U3D _2Ck0  * @param args
;xB,gQX'h s7h0I0  */51Testing软件测试网 dwBm \J'`NQ,Kn
 public static void main(String[] args) {
&XdH4^Z'H0  // TODO Auto-generated method stub
z.X9KX!KGT0  ChineseNER a = new ChineseNER();51Testing软件测试网` Yc&S0Y0NyZGb"d
  String line = "星期一中国北京";
K4w7ye/l.w0  System.out.println(line);
[u[ I"?Bv0  String b = a.process(line);
^9~ ^!|4JD0  a.say(b);51Testing软件测试网 t4V4b\+V#{I
 }51Testing软件测试网 C8eDw-p
}

i c wy0L7t0

TAG:

 

评分:0

我来说两句

Open Toolbar