Skip to content

Instantly share code, notes, and snippets.

@bczhc
Last active January 12, 2024 07:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bczhc/cd271734f812f32b4c9c70c766f1c95f to your computer and use it in GitHub Desktop.
Save bczhc/cd271734f812f32b4c9c70c766f1c95f to your computer and use it in GitHub Desktop.
Build librime for Android targets

Clone Trime

git clone https://github.com/osfans/trime --recursive

Apply patch

diff --git a/app/src/main/jni/librime_jni/rime_jni.cc b/app/src/main/jni/librime_jni/rime_jni.cc
index 0dfd132b..419d3a07 100644
--- a/app/src/main/jni/librime_jni/rime_jni.cc
+++ b/app/src/main/jni/librime_jni/rime_jni.cc
@@ -11,7 +11,7 @@ extern void rime_require_module_lua();
 extern void rime_require_module_charcode();
 extern void rime_require_module_octagram();
 // librime is compiled as a static library, we have to link modules explicitly
-static void declare_librime_module_dependencies() {
+extern "C" void declare_librime_module_dependencies() {
   rime_require_module_lua();
   rime_require_module_charcode();
   rime_require_module_octagram();
@@ -132,11 +132,11 @@ static inline bool is_rime_running() { return Rime::Instance().isRunning(); }
 
 GlobalRefSingleton *GlobalRef;
 
-JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
+/*JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
   GlobalRef = new GlobalRefSingleton(jvm);
   declare_librime_module_dependencies();
   return JNI_VERSION_1_6;
-}
+}*/
 
 extern "C" JNIEXPORT void JNICALL Java_com_osfans_trime_core_Rime_startupRime(
     JNIEnv *env, jclass clazz, jstring shared_dir, jstring user_dir,

Build

Save this script as app/src/main/jni/build:

#!/bin/env ruby

`rm -rf libs; mkdir libs`

ndk_dir = ENV['ANDROID_HOME'] + '/ndk-ln'

targets = 'arm64-v8a-29,x86-29,armeabi-v7a-21,x86_64-29'
targets.split(',').each do |group|
  `rm -rf target; mkdir target`
  Dir.chdir 'target'
  scan = group.scan(/^(.*)-([0-9]+)$/)
  abi = scan[0][0]
  api = scan[0][1]
  puts [abi, api].inspect
  lib_copy_dir = "../libs/#{abi}"
  Dir.mkdir lib_copy_dir
  system "cmake \
      -DCMAKE_TOOLCHAIN_FILE=#{ndk_dir}/build/cmake/android.toolchain.cmake \
      -DANDROID_ABI=#{abi} \
      -DANDROID_PLATFORM=android-#{api} -G Ninja .."
  system 'ninja'
  `cp -v 'librime_jni/librime_jni.so' #{lib_copy_dir}/librime.so`
  Dir.chdir '..'
end

Then check and replace ndk_dir variable, and run it:

cd /app/src/main/jni
./build

Artifacts:

~/open-source/trime/app/src/main/jni develop ⇡2 !1 ?4 ❯ tree libs                                                            11:23:51
libs
├── arm64-v8a
│   └── librime.so
├── armeabi-v7a
│   └── librime.so
├── x86
│   └── librime.so
└── x86_64
    └── librime.so

5 directories, 4 files
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment