Android 汉字转拼音之JNI篇

package com.tool.hz2py; import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView; public class MainActivity extends Activity { protected Hz2py hz2py; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hz2py = new Hz2py();
TextView view = (TextView) findViewById(R.id.text);
view.setText(hz2py.hz2py("汉字转拼音"));
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }
jni类:Hz2py
package com.tool.hz2py;
public class Hz2py {
static {
System.loadLibrary("Hz2py");
};
public native String hz2py(String text);
}
下面是C++头文件和代码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_tool_hz2py_Hz2py */ #ifndef _Included_com_tool_hz2py_Hz2py
#define _Included_com_tool_hz2py_Hz2py
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_tool_hz2py_Hz2py
* Method: hz2py
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_tool_hz2py_Hz2py_hz2py
(JNIEnv *, jobject, jstring); #ifdef __cplusplus
}
#endif
#endif
#include "hz2py.h"
#include <string.h>
#include "com_tool_hz2py_Hz2py.h" #define HZ2PY_UTF8_CHECK_LENGTH 20
#define HZ2PY_FILE_READ_BUF_ARRAY_SIZE 1000
#define HZ2PY_INPUT_BUF_ARRAY_SIZE 1024
#define HZ2PY_OUTPUT_BUF_ARRAY_SIZE 2048
#define HZ2PY_STR_COPY(to, from, count) \
ok = 1;\
i = 0;\
_tmp = from;\
while(i < count)\
{\
if (*_tmp == '\0')\
{\
ok = 0;\
break;\
}\
_tmp ++;\
i ++;\
}\
if (ok)\
{\
i = 0;\
while(i < count)\
{\
*to = *from;\
to ++;\
from ++;\
i ++;\
}\
}\
else\
{\
if (overage_buff != NULL)\
{\
while(*from != '\0')\
{\
*overage_buff = *from;\
from ++;\
}\
}\
break;\
} //将utf8编码的字符串中的汉字解成拼音
// in 输入
// out 输出
// first_letter_only 是否只输出拼音首字母
// polyphone_support 是否输出多音字
// add_blank 是否在拼音之间追加空格
// convert_double_char 是否转换全角字符为半角字符
// overage_buff 末尾如果有多余的不能组成完整utf8字符的字节,将写到overage_buff,传NULL将输出到out void utf8_to_pinyin(char *in, char *out, int first_letter_only,
int polyphone_support, int add_blank, int convert_double_char,
char *overage_buff) {
int i = 0;
char *utf = in;
char *_tmp;
char *_tmp2;
char py_tmp[30] = "";
char py_tmp2[30] = "";
char *out_start_flag = out;
int uni;
int ok = 0;
while (*utf != '\0') {
if ((*utf >> 7) == 0) {
HZ2PY_STR_COPY(out, utf, 1);
//如果为一个字节加上#号分隔
*out = '#'; //用#号做为分隔符
out++;
//去掉其它的英文只留汉字
//只能搜索到汉字拼音里面字母
// out--;
// *out = ' ';
}
//两个字节
else if ((*utf & 0xE0) == 0xC0) {
HZ2PY_STR_COPY(out, utf, 2);
}
//三个字节
else if ((*utf & 0xF0) == 0xE0) {
if (*(utf + 1) != '\0' && *(utf + 2) != '\0') {
uni = (((int) (*utf & 0x0F)) << 12)
| (((int) (*(utf + 1) & 0x3F)) << 6)
| (*(utf + 2) & 0x3F); if (uni > 19967 && uni < 40870) {
memset(py_tmp, '\0', 30);
memset(py_tmp2, '\0', 30);
strcpy(py_tmp, _pinyin_table_[uni - 19968]);
_tmp = py_tmp;
_tmp2 = py_tmp2; if (first_letter_only == 1) {
*_tmp2 = *_tmp;
_tmp++;
_tmp2++;
while (*_tmp != '\0') {
if (*_tmp == '|' || *(_tmp - 1) == '|') {
*_tmp2 = *_tmp;
_tmp2++;
}
_tmp++;
}
} else {
strcpy(py_tmp2, py_tmp);
} _tmp2 = py_tmp2; if (polyphone_support == 0) {
while (*_tmp2 != '\0') {
if (*_tmp2 == '|') {
*_tmp2 = '\0';
break;
}
_tmp2++;
}
_tmp2 = py_tmp2;
}
strcpy(out, _tmp2);
out += strlen(_tmp2);
if (add_blank) {
*out = '#'; //用#号做为分隔符
out++;
}
utf += 3;
} else if (convert_double_char && uni > 65280 && uni < 65375) {
*out = uni - 65248;
out++;
utf += 3;
} else if (convert_double_char && uni == 12288) {
*out = 32;
out++;
utf += 3;
} else {
HZ2PY_STR_COPY(out, utf, 3);
}
} else {
HZ2PY_STR_COPY(out, utf, 3);
}
}
//四个字节
else if ((*utf & 0xF8) == 0xF0) {
HZ2PY_STR_COPY(out, utf, 4);
}
//五个字节
else if ((*utf & 0xFC) == 0xF8) {
HZ2PY_STR_COPY(out, utf, 5);
}
//六个字节
else if ((*utf & 0xFE) == 0xFC) {
HZ2PY_STR_COPY(out, utf, 6);
} else {
if (overage_buff != NULL) {
*overage_buff = *utf;
overage_buff++;
} else {
HZ2PY_STR_COPY(out, utf, 1);
}
break;
}
}
} //判断一个字符串是否为utf8编码
int is_utf8_string(char *utf) {
int length = strlen(utf);
int check_sub = 0;
int i = 0; if (length > HZ2PY_UTF8_CHECK_LENGTH) {
length = HZ2PY_UTF8_CHECK_LENGTH;
} for (; i < length; i++) {
if (check_sub == 0) {
if ((utf[i] >> 7) == 0) {
continue;
} else if ((utf[i] & 0xE0) == 0xC0) {
check_sub = 1;
} else if ((utf[i] & 0xF0) == 0xE0) {
check_sub = 2;
} else if ((utf[i] & 0xF8) == 0xF0) {
check_sub = 3;
} else if ((utf[i] & 0xFC) == 0xF8) {
check_sub = 4;
} else if ((utf[i] & 0xFE) == 0xFC) {
check_sub = 5;
} else {
return 0;
}
} else {
if ((utf[i] & 0xC0) != 0x80) {
return 0;
}
check_sub--;
}
}
return 1;
} int hztpy(const char *read_buff, char *outbuf) {
char overage_buff[7] = { 0 };
char *_tmp = NULL;
char inbuf[HZ2PY_INPUT_BUF_ARRAY_SIZE] = { 0 };
int add_blank = 1;
int polyphone_support = 1;
int first_letter_only = 0;
int convert_double_char = 0; // first_letter_only 是否只输出拼音首字母
// polyphone_support 是否输出多音字
// add_blank 是否在拼音之间追加空格
// convert_double_char 是否转换全角字符为半角字符
// overage_buff 末尾如果有多余的不能组成完整utf8字符的字节,将写到overage_buff,传NULL将输出到out _tmp = inbuf;
if (strlen(overage_buff)) {
strcpy(_tmp, overage_buff);
_tmp += strlen(overage_buff);
memset(overage_buff, '\0', 7);
}
strcpy(_tmp, read_buff);
if (!is_utf8_string(inbuf)) {
return -1;
}
utf8_to_pinyin(inbuf, outbuf, first_letter_only, polyphone_support,
add_blank, convert_double_char, overage_buff);
return 1;
} JNIEXPORT jstring JNICALL Java_com_tool_hz2py_Hz2py_hz2py(JNIEnv *env,
jobject thiz, jstring text) {
const char* pText = env->GetStringUTFChars(text, 0);
char* oText = new char[512];//256中文
memset(oText,0,512);
hztpy(pText,oText);
jstring returnText = env->NewStringUTF(oText);
env->ReleaseStringUTFChars(text,pText);
delete oText;
return returnText;
}
头文件有点大,我直接上传给大家下载好了。
hz2py
直接编译好的.so共享库和java文件,注意,包名只能用这个,不能更改。
libHz2py
- 本文固定链接: http://www.ithtw.com/37.html
- 转载请注明: leehom 2014年08月05日 于 IT十万为什么 发表
Android 汉字转拼音之JNI篇的更多相关文章
- Android 汉字转拼音之工具篇
/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Versi ...
- xamarin android 汉字转拼音
使用微软的 ChnCharInfo.dll,这个库不仅能在 windows 下完美运行,竟单独在android下也可以完美运行,直接引用即可.当然是使用 visual studio 开发安卓啦,具体用 ...
- Android环境下hanlp汉字转拼音功能的使用介绍
由于项目需要在Android手机设备上实现汉字转拼音功能(支持多音字),于是首先想到了Pinyin4j+多音字映射对照表的实现方案,并在项目中试用了一段时间,发现数据量大时,其耗时非常严重.后来寻找其 ...
- 【干货】JS版汉字与拼音互转终极方案,附简单的JS拼音输入法
前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多音字,有的不支持声调,有的字典文件太大,还比如有时候我仅仅是需要获取汉字拼音首字母却要引入200kb的字 ...
- C#汉字转拼音(支持多音字)
之前由于项目需要,中间需要一个汉字转拼音和首拼的功能来做查询,感觉这种功能基本已经成熟化了,于是查找了相关的代码,首先引入眼帘的是下面两篇文章 1.C# 汉字转拼音(支持GB2312字符集中所有汉字) ...
- 优化后的 google提供的汉字转拼音类(针对某些htc等手机的不兼容情况)
/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Versi ...
- php获取汉字的拼音 拼音首字母
/***获取汉字的拼音*/function pinyin($s, $isfirst = false) { static $pinyins; $s = trim($s); $len = strlen($ ...
- (转)汉字转拼音HanziToPinyin
本文转载于:http://blog.csdn.net/zhangphil/article/details/47164665 Android系统本身自带有有将汉字转化为英文拼音的类和方法.具体的类就是H ...
- Microsoft Visual Studio International Pack 1.0 SR1--关于汉字转拼音
Microsoft Visual Studio International Pack 1.0 SR1————微软的一个类库 地址:http://www.microsoft.com/zh-cn/down ...
随机推荐
- javascript高级知识分析——上下文
如果函数是一个对象的属性,那么它可以? var katana = { isSharp: true, use: function(){ this.isSharp = !this.isSharp; } } ...
- 将类数组对象(array-like object)转化为数组对象(Array object)
用法:Array.prototype.slice.call(array-like object) // 创建一个类数组对象 var alo = {0:"a", 1:"b& ...
- Phoegap(cordova)开发跨平台app之HelloWorld
PhoneGap(cordova)的hellworld程序 1 安装JDK 配置环境变量: 2 安装android-sdk 配置环境变量: set Path=E ...
- MS SQLSERVER通用存储过程分页
最近在面试的时候,遇到个奇葩的秃顶老头面试官. 问:写过存储过程分页吗? 答:没写过,但是我知道分页存储的原理,我自己也写过,只是在工作中没写过. 问:那你这么多年工作中就没写过吗? 答:的确没写过, ...
- mysql 5.6.20的安装、配置服务、设置编码格式
一.安装 安装环境 系统:Window 32 版本:Mysql 5.6.20 1. 首先从官网上http://dev.mysql.com/downloads/mysql/ ...
- nginx代理配置
server { listen 80; server_name api.colortrip.cn; client_max_body_size 10m; a ...
- echarts 地图与时间轴混搭
//常量定义public class Constant { public static Integer PM_YEAR_NO = 5; } //action public class ZhiBiaoP ...
- javascript将异步校验表单改写为同步表单
同步表单校验的缺点 响应错误信息时,需要重新加载整个页面(虽然有缓存,客户端仍然需要通过http协议对比每个文件是否有更新,以保持文件最新) 服务器响应错误以后,用户之前所输入的信息全部丢失了,用户需 ...
- Critical Log Review Checklist for Security Incidents
Critical Log Review Checklist for Security Incidents This cheat sheet presents a checklist for revie ...
- dom元素和方法总结
主要是参考<精通javascript>. 全局变量有: document.这个变量包含浏览器的html dom文档的引用. HTMElement 这个变量是所要html dom 元素的超类 ...