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:
parent
13b89d4922
commit
3068b5a68a
6 changed files with 51 additions and 2 deletions
|
@ -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;") );
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue