我正在尝试本地化一个使用 Native C++ 的应用程序。大多数用 C++ 编写的代码和所有字符串/文本都位于特定的构建标志中。例如 LANG_JP // 对于日语
我已经为我的项目创建了一个按需动态模块,即“module_jp”。 基本模块和动态模块之间的区别在于,在 module_jp 的 build.gradle 中,它将有一个额外的 cpp 标志。
**module_jp's build.gradle**
plugins {
id 'com.android.dynamic-feature'
}
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
cppFlags "-fno-rtti -DLUTF8 -DLANG_JP" // Added extra flag here LANG_JP
}
}
}
除此之外,我还创建了单独的 CMakeLists.txt 来创建新库,即 (libnative-activity-jp.so)
**module_jp's CMakeLists.txt**
...
add_library( # Sets the name of the library.
native-activity-jp
# Sets the library as a shared library.
SHARED
...
...
target_include_directories(
native-activity-jp PRIVATE
${PLAYCORE_LOCATION}/include
)
...
target_link_libraries( # Specifies the target library.
native-activity-jp
...
我的应用程序首先询问用户喜欢什么语言。之后,在主活动上,它将加载用户喜欢的库。例如,如果用户更喜欢日语,则会调用 System.LoadLibrary("native-activity-jp");如果是英文,它只会加载基础库。 System.LoadLibrary(“本机活动”);
// LanguageSelectionActivity
// This function open the native activity to start the normal process
private void StartMainActivity(String LanguageCode) {
if (LanguageCode.equals("en")) System.loadLibrary("native-activity");
else System.loadLibrary("native-activity-" + szLanguageCode);
// Initialize intent to start the normal activity
Intent intent = new Intent(getApplicationContext(), NativeActivity.class);
startActivity(intent);
finish();
}
问题 在本地测试时一切似乎都很好。当用户选择 jp 时,它只会显示确切的应用程序以及从 C++ 源文件中获取的翻译后的 JP 文本。然而,当在 Google 的封闭测试(Alpha)和内部应用程序共享中上传时,日志显示 module_jp 确实已安装,并且正在加载“libnative-activity-jp.so”,但它仍然显示 EN 翻译,告诉我“libnative-activity.so”。所以”首先被加载。
我尝试通过
调查该问题问题
发现问题了。这是由作为源集一部分包含的其他 Java 活动的静态初始化程序块内的 System.loadLibrary 调用引起的。
static {
System.loadLibrary("native-activity");
}
基本上,静态初始化程序块内的代码语句是在加载此不需要的库(libnative-activity.so)的任何对象初始化之前调用的。通过删除此静态初始化程序块并在 MainActivity 的 onCreate() 函数中加载所需的库来解决此问题。