# AndroidFastText **Repository Path**: iuact/AndroidFastText ## Basic Information - **Project Name**: AndroidFastText - **Description**: xxxxxxxxxxxxxxxxxxxxxxx - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-27 - **Last Updated**: 2026-06-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AndroidFastText 本文将Fasttext 制作成so,放到Android apk中,进行运用。 fastText 原文 https://github.com/facebookresearch/fastText ## Fast start adb push demo/modelyule.bin adb install demo/app-debug.apk ## 详细的搬迁方案 https://zhuanlan.zhihu.com/p/263339726 ## 展示 ![apk界面](./demo/1.png) 3、Android SDK和so制作。 3.1、SDK: 在src中添加两个文件,写成一个类,制作成一个简单的SDK。 predictTool.h ```cpp class PredictTool { private: /* data */ public: PredictTool(/* args */); ~PredictTool(); void loadModel(const std::string& filename); std::vector> predictProcess(std::string text, int topk, float threshold); }; ``` predictTool.cc ```cpp FastText fasttextloader; PredictTool::PredictTool(/* args */) { std::cerr << "predictTool make" << std::endl; } PredictTool::~PredictTool() { std::cerr << "predictTool release" << std::endl; } void PredictTool::loadModel(const std::string& filename) { fasttextloader.loadModel(filename); } std::vector> PredictTool::predictProcess(std::string text, int topk, float threshold) { //check std::stringstream ioss(text); std::vector> predictions; fasttextloader.predictLine(ioss, predictions, topk, threshold); return predictions; } ``` 3.2、编译出Android的SO: 建立新的PlatFormBuild目录,添加新的Android编译脚本。 BuildArmV8a.sh ```sh #!/bin/bash cmake ../../../ \ -DCMAKE_TOOLCHAIN_FILE=$NDKROOT/build/cmake/android.toolchain.cmake \ -DCMAKE_BUILD_TYPE=Release \ -DANDROID_ABI="arm64-v8a" \ -DANDROID_STL=c++_static \ -DANDROID_NATIVE_API_LEVEL=android-21 \ -DNATIVE_LIBRARY_OUTPUT=. -DNATIVE_INCLUDE_OUTPUT=. $1 $2 make -j4 ``` 构建新的目录 mkdir PlatFormBuild/build/ cd PlatFormBuild/build/ 运行新的目录 ../BuildArmV8a.sh 将编译好的so放到Android工程中运用。 4、Android apk制作。 在jni中调研so,加载sdcard中的模型文件。 ```c extern "C" JNIEXPORT void JNICALL Java_com_example_fasttextapplication_Native_nativeLoadmodel(JNIEnv *env, jclass type, jstring path_) { const char *path = env->GetStringUTFChars(path_, 0); std::string filename("/sdcard/modelyule.bin"); tool.loadModel(filename); env->ReleaseStringUTFChars(path_, path); } ``` 调用预测接口进行预测 ```c extern "C" JNIEXPORT jint JNICALL Java_com_example_fasttextapplication_Native_nativePredictProcess(JNIEnv *env, jclass type, jstring text_, jint topk, jfloat threshold) { const char *text = env->GetStringUTFChars(text_, 0); std::string s1 = text; std::pair> predictions = tool.predictProcess(s1, 1, 0.0); int isClass = -1; for (const auto& prediction : predictions) { std::string classpredict = (std::string)prediction.second; std::string nvxing = "__label__nvxing1.txt"; std::string wenxue = "__label__wenxue1.txt"; std::string xiaoyuan = "__label__xiaoyuan1.txt"; std::string tiyu = "__label__tiyu1.txt"; if (strcmp(classpredict.c_str(), nvxing.c_str()) == 0) { isClass = 0; } else if (strcmp(classpredict.c_str(), wenxue.c_str()) == 0) { isClass = 1; } else if (strcmp(classpredict.c_str(), xiaoyuan.c_str()) == 0) { isClass = 2; } else if (strcmp(classpredict.c_str(), tiyu.c_str()) == 0) { isClass = 3; } } env->ReleaseStringUTFChars(text_, text); return isClass; } ``` 5、开源地址: facebookresearch/fastText github.com/facebookresearch/fastText djh123/AndroidFastText github.com/djh123/AndroidFastText