1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-05 10:49:24 +02:00

encoding converter (in progress)

This commit is contained in:
Nikolay Pultsin 2012-03-17 20:28:30 +00:00
parent 13b89d4922
commit 3068b5a68a
6 changed files with 51 additions and 2 deletions

View file

@ -29,6 +29,8 @@ const char * const AndroidUtil::Class_java_io_PrintStream = "java/io/PrintStream
const char * const AndroidUtil::Class_ZLibrary = "org/geometerplus/zlibrary/core/library/ZLibrary"; const char * const AndroidUtil::Class_ZLibrary = "org/geometerplus/zlibrary/core/library/ZLibrary";
const char * const AndroidUtil::Class_NativeFormatPlugin = "org/geometerplus/fbreader/formats/NativeFormatPlugin"; const char * const AndroidUtil::Class_NativeFormatPlugin = "org/geometerplus/fbreader/formats/NativeFormatPlugin";
const char * const AndroidUtil::Class_PluginCollection = "org/geometerplus/fbreader/formats/PluginCollection"; const char * const AndroidUtil::Class_PluginCollection = "org/geometerplus/fbreader/formats/PluginCollection";
const char * const AndroidUtil::Class_Encoding = "org/geometerplus/fbreader/formats/Encoding";
const char * const AndroidUtil::Class_EncodingConverter = "org/geometerplus/fbreader/formats/EncodingConverter";
const char * const AndroidUtil::Class_JavaEncodingCollection = "org/geometerplus/fbreader/formats/JavaEncodingCollection"; const char * const AndroidUtil::Class_JavaEncodingCollection = "org/geometerplus/fbreader/formats/JavaEncodingCollection";
const char * const AndroidUtil::Class_Paths = "org/geometerplus/fbreader/Paths"; const char * const AndroidUtil::Class_Paths = "org/geometerplus/fbreader/Paths";
const char * const AndroidUtil::Class_ZLFile = "org/geometerplus/zlibrary/core/filesystem/ZLFile"; const char * const AndroidUtil::Class_ZLFile = "org/geometerplus/zlibrary/core/filesystem/ZLFile";
@ -58,6 +60,11 @@ jmethodID AndroidUtil::MID_NativeFormatPlugin_supportedFileType;
jmethodID AndroidUtil::SMID_PluginCollection_Instance; jmethodID AndroidUtil::SMID_PluginCollection_Instance;
jmethodID AndroidUtil::MID_Encoding_createConverter;
jmethodID AndroidUtil::MID_EncodingConverter_convert;
jmethodID AndroidUtil::MID_EncodingConverter_reset;
jmethodID AndroidUtil::SMID_JavaEncodingCollection_Instance; jmethodID AndroidUtil::SMID_JavaEncodingCollection_Instance;
jmethodID AndroidUtil::MID_JavaEncodingCollection_getEncoding_int; jmethodID AndroidUtil::MID_JavaEncodingCollection_getEncoding_int;
jmethodID AndroidUtil::MID_JavaEncodingCollection_getEncoding_String; jmethodID AndroidUtil::MID_JavaEncodingCollection_getEncoding_String;
@ -148,6 +155,15 @@ bool AndroidUtil::init(JavaVM* jvm) {
CHECK_NULL( SMID_PluginCollection_Instance = env->GetStaticMethodID(cls, "Instance", "()Lorg/geometerplus/fbreader/formats/PluginCollection;") ); CHECK_NULL( SMID_PluginCollection_Instance = env->GetStaticMethodID(cls, "Instance", "()Lorg/geometerplus/fbreader/formats/PluginCollection;") );
env->DeleteLocalRef(cls); env->DeleteLocalRef(cls);
CHECK_NULL( cls = env->FindClass(Class_Encoding) );
CHECK_NULL( MID_Encoding_createConverter = env->GetMethodID(cls, "createConverter", "()Lorg/geometerplus/fbreader/formats/EncodingConverter;") );
env->DeleteLocalRef(cls);
CHECK_NULL( cls = env->FindClass(Class_EncodingConverter) );
CHECK_NULL( MID_EncodingConverter_convert = env->GetMethodID(cls, "convert", "([BII[BI)I") );
CHECK_NULL( MID_EncodingConverter_reset = env->GetMethodID(cls, "reset", "()V") );
env->DeleteLocalRef(cls);
CHECK_NULL( cls = env->FindClass(Class_JavaEncodingCollection) ); CHECK_NULL( cls = env->FindClass(Class_JavaEncodingCollection) );
CHECK_NULL( SMID_JavaEncodingCollection_Instance = env->GetStaticMethodID(cls, "Instance", "()Lorg/geometerplus/fbreader/formats/JavaEncodingCollection;") ); CHECK_NULL( SMID_JavaEncodingCollection_Instance = env->GetStaticMethodID(cls, "Instance", "()Lorg/geometerplus/fbreader/formats/JavaEncodingCollection;") );
CHECK_NULL( MID_JavaEncodingCollection_getEncoding_String = env->GetMethodID(cls, "getEncoding", "(Ljava/lang/String;)Lorg/geometerplus/fbreader/formats/Encoding;") ); CHECK_NULL( MID_JavaEncodingCollection_getEncoding_String = env->GetMethodID(cls, "getEncoding", "(Ljava/lang/String;)Lorg/geometerplus/fbreader/formats/Encoding;") );

View file

@ -40,6 +40,8 @@ public:
static const char * const Class_ZLFile; static const char * const Class_ZLFile;
static const char * const Class_NativeFormatPlugin; static const char * const Class_NativeFormatPlugin;
static const char * const Class_PluginCollection; static const char * const Class_PluginCollection;
static const char * const Class_Encoding;
static const char * const Class_EncodingConverter;
static const char * const Class_JavaEncodingCollection; static const char * const Class_JavaEncodingCollection;
static const char * const Class_Paths; static const char * const Class_Paths;
static const char * const Class_Book; static const char * const Class_Book;
@ -76,6 +78,11 @@ public:
static jmethodID SMID_PluginCollection_Instance; static jmethodID SMID_PluginCollection_Instance;
static jmethodID MID_Encoding_createConverter;
static jmethodID MID_EncodingConverter_convert;
static jmethodID MID_EncodingConverter_reset;
static jmethodID SMID_JavaEncodingCollection_Instance; static jmethodID SMID_JavaEncodingCollection_Instance;
static jmethodID MID_JavaEncodingCollection_getEncoding_String; static jmethodID MID_JavaEncodingCollection_getEncoding_String;
static jmethodID MID_JavaEncodingCollection_getEncoding_int; static jmethodID MID_JavaEncodingCollection_getEncoding_int;

View file

@ -40,6 +40,9 @@ friend class JavaEncodingConverterProvider;
}; };
bool JavaEncodingConverterProvider::providesConverter(const std::string &encoding) { bool JavaEncodingConverterProvider::providesConverter(const std::string &encoding) {
if (encoding.empty()) {
return false;
}
JNIEnv *env = AndroidUtil::getEnv(); JNIEnv *env = AndroidUtil::getEnv();
jclass cls = env->FindClass(AndroidUtil::Class_JavaEncodingCollection); jclass cls = env->FindClass(AndroidUtil::Class_JavaEncodingCollection);
jobject collection = env->CallStaticObjectMethod(cls, AndroidUtil::SMID_JavaEncodingCollection_Instance); jobject collection = env->CallStaticObjectMethod(cls, AndroidUtil::SMID_JavaEncodingCollection_Instance);
@ -54,9 +57,20 @@ shared_ptr<ZLEncodingConverter> JavaEncodingConverterProvider::createConverter(c
} }
JavaEncodingConverter::JavaEncodingConverter(const std::string &encoding) { JavaEncodingConverter::JavaEncodingConverter(const std::string &encoding) {
JNIEnv *env = AndroidUtil::getEnv();
jclass cls = env->FindClass(AndroidUtil::Class_JavaEncodingCollection);
jobject collection = env->CallStaticObjectMethod(cls, AndroidUtil::SMID_JavaEncodingCollection_Instance);
jstring encodingName = AndroidUtil::createJavaString(env, encoding);
jobject javaEncoding = env->CallObjectMethod(collection, AndroidUtil::MID_JavaEncodingCollection_getEncoding_String, encodingName);
myJavaConverter = env->CallObjectMethod(javaEncoding, AndroidUtil::MID_Encoding_createConverter);
env->DeleteLocalRef(javaEncoding);
env->DeleteLocalRef(encodingName);
env->DeleteLocalRef(collection);
env->DeleteLocalRef(cls);
} }
JavaEncodingConverter::~JavaEncodingConverter() { JavaEncodingConverter::~JavaEncodingConverter() {
AndroidUtil::getEnv()->DeleteLocalRef(myJavaConverter);
} }
void JavaEncodingConverter::convert(std::string &dst, const char *srcStart, const char *srcEnd) { void JavaEncodingConverter::convert(std::string &dst, const char *srcStart, const char *srcEnd) {

View file

@ -36,6 +36,14 @@
public ** supportedFileType(); public ** supportedFileType();
} }
-keep class org.geometerplus.fbreader.formats.Encoding -keep class org.geometerplus.fbreader.formats.Encoding
-keepclassmembers class org.geometerplus.fbreader.formats.Encoding {
public ** createConverter();
}
-keep class org.geometerplus.fbreader.formats.EncodingConverter
-keepclassmembers class org.geometerplus.fbreader.formats.EncodingConverter {
public int convert(byte[],int,int,byte[],int);
public void reset();
}
-keep class org.geometerplus.fbreader.formats.JavaEncodingCollection -keep class org.geometerplus.fbreader.formats.JavaEncodingCollection
-keepclassmembers class org.geometerplus.fbreader.formats.JavaEncodingCollection { -keepclassmembers class org.geometerplus.fbreader.formats.JavaEncodingCollection {
public static ** Instance(); public static ** Instance();

View file

@ -39,4 +39,8 @@ public final class Encoding {
public int hashCode() { public int hashCode() {
return Name.hashCode(); return Name.hashCode();
} }
public EncodingConverter createConverter() {
return new EncodingConverter(Name);
}
} }

View file

@ -35,7 +35,7 @@ public class EncodingConverter {
// we assume out is large enough for this conversion // we assume out is large enough for this conversion
// returns number of filled bytes in out buffer // returns number of filled bytes in out buffer
int convert(byte[] in, int inOffset, int inLength, byte[] out, int outOffset) { public int convert(byte[] in, int inOffset, int inLength, byte[] out, int outOffset) {
final ByteBuffer inBuffer = ByteBuffer.wrap(in, inOffset, inLength); final ByteBuffer inBuffer = ByteBuffer.wrap(in, inOffset, inLength);
final ByteBuffer outBuffer = ByteBuffer.wrap(out, outOffset, out.length - outOffset); final ByteBuffer outBuffer = ByteBuffer.wrap(out, outOffset, out.length - outOffset);
try { try {
@ -47,7 +47,7 @@ public class EncodingConverter {
} }
} }
void reset() { public void reset() {
myDecoder.reset(); myDecoder.reset();
myEncoder.reset(); myEncoder.reset();
} }