* commit '9407aa7cf0b369d31bd6c69f9c26bdf6a1f44fe9': Load binary hyphen data files
This commit is contained in:
@@ -16,15 +16,17 @@
|
|||||||
|
|
||||||
package android.text;
|
package android.text;
|
||||||
|
|
||||||
import com.android.internal.annotations.GuardedBy;
|
|
||||||
|
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import libcore.io.IoUtils;
|
import com.android.internal.annotations.GuardedBy;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.RandomAccessFile;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.MappedByteBuffer;
|
||||||
|
import java.nio.channels.FileChannel;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
@@ -45,12 +47,18 @@ public class Hyphenator {
|
|||||||
@GuardedBy("sLock")
|
@GuardedBy("sLock")
|
||||||
final static HashMap<Locale, Hyphenator> sMap = new HashMap<Locale, Hyphenator>();
|
final static HashMap<Locale, Hyphenator> sMap = new HashMap<Locale, Hyphenator>();
|
||||||
|
|
||||||
final static Hyphenator sEmptyHyphenator = new Hyphenator(StaticLayout.nLoadHyphenator(""));
|
final static Hyphenator sEmptyHyphenator =
|
||||||
|
new Hyphenator(StaticLayout.nLoadHyphenator(null, 0), null);
|
||||||
|
|
||||||
final private long mNativePtr;
|
final private long mNativePtr;
|
||||||
|
|
||||||
private Hyphenator(long nativePtr) {
|
// We retain a reference to the buffer to keep the memory mapping valid
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
final private ByteBuffer mBuffer;
|
||||||
|
|
||||||
|
private Hyphenator(long nativePtr, ByteBuffer b) {
|
||||||
mNativePtr = nativePtr;
|
mNativePtr = nativePtr;
|
||||||
|
mBuffer = b;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getNativePtr() {
|
public long getNativePtr() {
|
||||||
@@ -94,12 +102,18 @@ public class Hyphenator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static Hyphenator loadHyphenator(String languageTag) {
|
private static Hyphenator loadHyphenator(String languageTag) {
|
||||||
String patternFilename = "hyph-"+languageTag.toLowerCase(Locale.US)+".pat.txt";
|
String patternFilename = "hyph-" + languageTag.toLowerCase(Locale.US) + ".hyb";
|
||||||
File patternFile = new File(getSystemHyphenatorLocation(), patternFilename);
|
File patternFile = new File(getSystemHyphenatorLocation(), patternFilename);
|
||||||
try {
|
try {
|
||||||
String patternData = IoUtils.readFileAsString(patternFile.getAbsolutePath());
|
RandomAccessFile f = new RandomAccessFile(patternFile, "r");
|
||||||
long nativePtr = StaticLayout.nLoadHyphenator(patternData);
|
try {
|
||||||
return new Hyphenator(nativePtr);
|
FileChannel fc = f.getChannel();
|
||||||
|
MappedByteBuffer buf = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
|
||||||
|
long nativePtr = StaticLayout.nLoadHyphenator(buf, 0);
|
||||||
|
return new Hyphenator(nativePtr, buf);
|
||||||
|
} finally {
|
||||||
|
f.close();
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "error loading hyphenation " + patternFile, e);
|
Log.e(TAG, "error loading hyphenation " + patternFile, e);
|
||||||
return null;
|
return null;
|
||||||
@@ -152,7 +166,7 @@ public class Hyphenator {
|
|||||||
sMap.put(null, null);
|
sMap.put(null, null);
|
||||||
|
|
||||||
// TODO: replace this with a discovery-based method that looks into /system/usr/hyphen-data
|
// TODO: replace this with a discovery-based method that looks into /system/usr/hyphen-data
|
||||||
String[] availableLanguages = {"en-US", "eu", "hu", "hy", "nb", "nn", "sa", "und-Ethi"};
|
String[] availableLanguages = {"en-US", "eu", "hu", "hy", "nb", "nn", "und-Ethi"};
|
||||||
for (int i = 0; i < availableLanguages.length; i++) {
|
for (int i = 0; i < availableLanguages.length; i++) {
|
||||||
String languageTag = availableLanguages[i];
|
String languageTag = availableLanguages[i];
|
||||||
Hyphenator h = loadHyphenator(languageTag);
|
Hyphenator h = loadHyphenator(languageTag);
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import android.util.Pools.SynchronizedPool;
|
|||||||
import com.android.internal.util.ArrayUtils;
|
import com.android.internal.util.ArrayUtils;
|
||||||
import com.android.internal.util.GrowingArrayUtils;
|
import com.android.internal.util.GrowingArrayUtils;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
@@ -1244,7 +1245,7 @@ public class StaticLayout extends Layout {
|
|||||||
private static native void nFreeBuilder(long nativePtr);
|
private static native void nFreeBuilder(long nativePtr);
|
||||||
private static native void nFinishBuilder(long nativePtr);
|
private static native void nFinishBuilder(long nativePtr);
|
||||||
|
|
||||||
/* package */ static native long nLoadHyphenator(String patternData);
|
/* package */ static native long nLoadHyphenator(ByteBuffer buf, int offset);
|
||||||
|
|
||||||
private static native void nSetLocale(long nativePtr, String locale, long nativeHyphenator);
|
private static native void nSetLocale(long nativePtr, String locale, long nativeHyphenator);
|
||||||
|
|
||||||
|
|||||||
@@ -117,9 +117,17 @@ static void nFinishBuilder(JNIEnv*, jclass, jlong nativePtr) {
|
|||||||
b->finish();
|
b->finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
static jlong nLoadHyphenator(JNIEnv* env, jclass, jstring patternData) {
|
static jlong nLoadHyphenator(JNIEnv* env, jclass, jobject buffer, jint offset) {
|
||||||
ScopedStringChars str(env, patternData);
|
const uint8_t* bytebuf = nullptr;
|
||||||
Hyphenator* hyphenator = Hyphenator::load(str.get(), str.size());
|
if (buffer != nullptr) {
|
||||||
|
void* rawbuf = env->GetDirectBufferAddress(buffer);
|
||||||
|
if (rawbuf != nullptr) {
|
||||||
|
bytebuf = reinterpret_cast<const uint8_t*>(rawbuf) + offset;
|
||||||
|
} else {
|
||||||
|
ALOGE("failed to get direct buffer address");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Hyphenator* hyphenator = Hyphenator::loadBinary(bytebuf);
|
||||||
return reinterpret_cast<jlong>(hyphenator);
|
return reinterpret_cast<jlong>(hyphenator);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,7 +185,7 @@ static JNINativeMethod gMethods[] = {
|
|||||||
{"nNewBuilder", "()J", (void*) nNewBuilder},
|
{"nNewBuilder", "()J", (void*) nNewBuilder},
|
||||||
{"nFreeBuilder", "(J)V", (void*) nFreeBuilder},
|
{"nFreeBuilder", "(J)V", (void*) nFreeBuilder},
|
||||||
{"nFinishBuilder", "(J)V", (void*) nFinishBuilder},
|
{"nFinishBuilder", "(J)V", (void*) nFinishBuilder},
|
||||||
{"nLoadHyphenator", "(Ljava/lang/String;)J", (void*) nLoadHyphenator},
|
{"nLoadHyphenator", "(Ljava/nio/ByteBuffer;I)J", (void*) nLoadHyphenator},
|
||||||
{"nSetLocale", "(JLjava/lang/String;J)V", (void*) nSetLocale},
|
{"nSetLocale", "(JLjava/lang/String;J)V", (void*) nSetLocale},
|
||||||
{"nSetupParagraph", "(J[CIFIF[IIII)V", (void*) nSetupParagraph},
|
{"nSetupParagraph", "(J[CIFIF[IIII)V", (void*) nSetupParagraph},
|
||||||
{"nSetIndents", "(J[I)V", (void*) nSetIndents},
|
{"nSetIndents", "(J[I)V", (void*) nSetIndents},
|
||||||
|
|||||||
Reference in New Issue
Block a user