JameWade
Committed by GitHub

add java android demo (#1454)

正在显示 45 个修改的文件 包含 1268 行增加0 行删除
  1 +*.iml
  2 +.gradle
  3 +/local.properties
  4 +/.idea/caches
  5 +/.idea/libraries
  6 +/.idea/modules.xml
  7 +/.idea/workspace.xml
  8 +/.idea/navEditor.xml
  9 +/.idea/assetWizardSettings.xml
  10 +.DS_Store
  11 +/build
  12 +/captures
  13 +.externalNativeBuild
  14 +.cxx
  15 +local.properties
  1 +plugins {
  2 + id 'com.android.application'
  3 +}
  4 +
  5 +android {
  6 + compileSdk 34
  7 +
  8 + defaultConfig {
  9 + applicationId "com.k2fsa.sherpa.onnx"
  10 + minSdk 28
  11 + targetSdk 32
  12 + versionCode 1
  13 + versionName "1.0"
  14 +
  15 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  16 + }
  17 +
  18 + buildTypes {
  19 + release {
  20 + minifyEnabled false
  21 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  22 + }
  23 + }
  24 + compileOptions {
  25 + sourceCompatibility JavaVersion.VERSION_1_8
  26 + targetCompatibility JavaVersion.VERSION_1_8
  27 + }
  28 + sourceSets.main{
  29 + jniLibs.srcDirs = ['jniLibs']
  30 + }
  31 +}
  32 +
  33 +dependencies {
  34 +
  35 + implementation 'androidx.appcompat:appcompat:1.3.1'
  36 + implementation 'com.google.android.material:material:1.3.0'
  37 + implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
  38 + implementation 'pub.devrel:easypermissions:3.0.0'
  39 + implementation project(path: ':sherpa')
  40 +
  41 +}
  1 +# Add project specific ProGuard rules here.
  2 +# You can control the set of applied configuration files using the
  3 +# proguardFiles setting in build.gradle.
  4 +#
  5 +# For more details, see
  6 +# http://developer.android.com/guide/developing/tools/proguard.html
  7 +
  8 +# If your project uses WebView with JS, uncomment the following
  9 +# and specify the fully qualified class name to the JavaScript interface
  10 +# class:
  11 +#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
  12 +# public *;
  13 +#}
  14 +
  15 +# Uncomment this to preserve the line number information for
  16 +# debugging stack traces.
  17 +#-keepattributes SourceFile,LineNumberTable
  18 +
  19 +# If you keep the line number information, uncomment this to
  20 +# hide the original source file name.
  21 +#-renamesourcefileattribute SourceFile
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3 + xmlns:tools="http://schemas.android.com/tools"
  4 + package="com.k2fsa.sherpa.onnx">
  5 + <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  6 + <uses-permission android:name="android.permission.RECORD_AUDIO" />
  7 +
  8 + <application
  9 + android:name=".Application"
  10 + android:allowBackup="true"
  11 + android:dataExtractionRules="@xml/data_extraction_rules"
  12 + android:fullBackupContent="@xml/backup_rules"
  13 + android:icon="@mipmap/ic_launcher"
  14 + android:label="@string/app_name"
  15 + android:roundIcon="@mipmap/ic_launcher_round"
  16 + android:supportsRtl="true"
  17 + android:theme="@style/Theme.SherpaOnnxJavaDemo"
  18 + tools:targetApi="31">
  19 + <activity
  20 + android:name=".MainActivity"
  21 + android:exported="true">
  22 + <intent-filter>
  23 + <action android:name="android.intent.action.MAIN" />
  24 + <category android:name="android.intent.category.LAUNCHER" />
  25 + </intent-filter>
  26 + </activity>
  27 + <service
  28 + android:name=".service.SpeechSherpaRecognitionService"
  29 + android:exported="false"/>
  30 + </application>
  31 +
  32 +</manifest>
  1 +package com.k2fsa.sherpa.onnx;
  2 +
  3 +import androidx.lifecycle.LiveData;
  4 +import androidx.lifecycle.MutableLiveData;
  5 +import androidx.lifecycle.ViewModel;
  6 +
  7 +public class AppViewModel extends ViewModel {
  8 + private final MutableLiveData<String> speechRecognitionResult = new MutableLiveData<>();
  9 +
  10 + public LiveData<String> getSpeechRecognitionResult() {
  11 + return speechRecognitionResult;
  12 + }
  13 +
  14 + public void setSpeechRecognitionResult(String result) {
  15 + speechRecognitionResult.postValue(result);
  16 + }
  17 +
  18 +}
  1 +package com.k2fsa.sherpa.onnx;
  2 +
  3 +import androidx.annotation.NonNull;
  4 +import androidx.lifecycle.ViewModelProvider;
  5 +import androidx.lifecycle.ViewModelStore;
  6 +import androidx.lifecycle.ViewModelStoreOwner;
  7 +
  8 +
  9 +public class Application extends android.app.Application implements ViewModelStoreOwner {
  10 + public static Application sApplication;
  11 +
  12 +
  13 + private AppViewModel viewModel;
  14 + private ViewModelStore viewModelStore;
  15 +
  16 + public static Application getInstance() {
  17 + return sApplication;
  18 + }
  19 +
  20 + @Override
  21 + public void onCreate() {
  22 + super.onCreate();
  23 + sApplication = this;
  24 + viewModelStore = new ViewModelStore();
  25 + viewModel = new ViewModelProvider(this).get(AppViewModel.class);
  26 + }
  27 +
  28 + @NonNull
  29 + @Override
  30 + public ViewModelStore getViewModelStore() {
  31 + return viewModelStore;
  32 + }
  33 +
  34 + public AppViewModel getViewModel() {
  35 + return viewModel;
  36 + }
  37 +
  38 +
  39 +}
  1 +package com.k2fsa.sherpa.onnx;
  2 +
  3 +import androidx.appcompat.app.AppCompatActivity;
  4 +import androidx.core.content.ContextCompat;
  5 +import androidx.lifecycle.ViewModelProvider;
  6 +
  7 +import android.Manifest;
  8 +import android.content.Intent;
  9 +import android.os.Bundle;
  10 +import android.util.Log;
  11 +import android.widget.TextView;
  12 +
  13 +import com.k2fsa.sherpa.onnx.service.SpeechSherpaRecognitionService;
  14 +
  15 +import pub.devrel.easypermissions.EasyPermissions;
  16 +
  17 +public class MainActivity extends AppCompatActivity {
  18 + private AppViewModel appViewModel;
  19 + private TextView tvText;
  20 + private static final int RC_AUDIO_PERM = 123;
  21 +
  22 + @Override
  23 + protected void onCreate(Bundle savedInstanceState) {
  24 + super.onCreate(savedInstanceState);
  25 + setContentView(R.layout.activity_main);
  26 + tvText = findViewById(R.id.text);
  27 + requestMicrophonePermission();
  28 + }
  29 +
  30 +
  31 + private void startSpeechService() {
  32 + Intent serviceIntent = new Intent(this, SpeechSherpaRecognitionService.class);
  33 + ContextCompat.startForegroundService(this, serviceIntent);
  34 + appViewModel = new ViewModelProvider(Application.getInstance()).get(AppViewModel.class);
  35 + appViewModel.getSpeechRecognitionResult().observe(this, this::handleSpeechRecognitionResult);
  36 + }
  37 +
  38 + private void handleSpeechRecognitionResult(String result) {
  39 + tvText.setText(result);
  40 + }
  41 +
  42 + private void requestMicrophonePermission() {
  43 + String[] perms = {Manifest.permission.RECORD_AUDIO};
  44 + if (EasyPermissions.hasPermissions(this, perms)) {
  45 + startSpeechService();
  46 + } else {
  47 + EasyPermissions.requestPermissions(MainActivity.this,
  48 + "We need access to your microphone for voice recognition",
  49 + RC_AUDIO_PERM, perms);
  50 + }
  51 + }
  52 +}
  1 +// Copyright 2022-2023 by zhaoming
  2 +// Copyright 2024 Xiaomi Corporation
  3 +
  4 +package com.k2fsa.sherpa.onnx;
  5 +
  6 +import android.content.res.AssetManager;
  7 +
  8 +public class OnlineRecognizer {
  9 + static {
  10 + System.loadLibrary("sherpa-onnx-jni");
  11 + }
  12 +
  13 + private long ptr = 0;
  14 +
  15 + public OnlineRecognizer(OnlineRecognizerConfig config) {
  16 + ptr = newFromFile(config);
  17 + }
  18 +
  19 + public OnlineRecognizer(AssetManager assetManager, OnlineRecognizerConfig config) {
  20 + ptr = newFromAsset(assetManager, config);
  21 + }
  22 +
  23 + public void decode(OnlineStream s) {
  24 + decode(ptr, s.getPtr());
  25 + }
  26 +
  27 + public boolean isReady(OnlineStream s) {
  28 + return isReady(ptr, s.getPtr());
  29 + }
  30 +
  31 + public boolean isEndpoint(OnlineStream s) {
  32 + return isEndpoint(ptr, s.getPtr());
  33 + }
  34 +
  35 + public void reset(OnlineStream s) {
  36 + reset(ptr, s.getPtr());
  37 + }
  38 +
  39 + public OnlineStream createStream() {
  40 + long p = createStream(ptr, "");
  41 + return new OnlineStream(p);
  42 + }
  43 +
  44 + @Override
  45 + protected void finalize() throws Throwable {
  46 + release();
  47 + }
  48 +
  49 + // You'd better call it manually if it is not used anymore
  50 + public void release() {
  51 + if (this.ptr == 0) {
  52 + return;
  53 + }
  54 + delete(this.ptr);
  55 + this.ptr = 0;
  56 + }
  57 +
  58 + public OnlineRecognizerResult getResult(OnlineStream s) {
  59 + Object[] arr = getResult(ptr, s.getPtr());
  60 + String text = (String) arr[0];
  61 + String[] tokens = (String[]) arr[1];
  62 + float[] timestamps = (float[]) arr[2];
  63 + return new OnlineRecognizerResult(text, tokens, timestamps);
  64 + }
  65 +
  66 +
  67 + private native void delete(long ptr);
  68 +
  69 + private native long newFromFile(OnlineRecognizerConfig config);
  70 +
  71 + private native long newFromAsset(AssetManager assetManager, OnlineRecognizerConfig config);
  72 +
  73 + private native long createStream(long ptr, String hotwords);
  74 +
  75 + private native void reset(long ptr, long streamPtr);
  76 +
  77 + private native void decode(long ptr, long streamPtr);
  78 +
  79 + private native boolean isEndpoint(long ptr, long streamPtr);
  80 +
  81 + private native boolean isReady(long ptr, long streamPtr);
  82 +
  83 + private native Object[] getResult(long ptr, long streamPtr);
  84 +}
  1 +package com.k2fsa.sherpa.onnx.service;
  2 +
  3 +import android.Manifest;
  4 +import android.app.Notification;
  5 +import android.app.NotificationChannel;
  6 +import android.app.NotificationManager;
  7 +import android.app.Service;
  8 +import android.content.Intent;
  9 +import android.content.pm.PackageManager;
  10 +import android.content.res.AssetManager;
  11 +import android.media.AudioFormat;
  12 +import android.media.AudioRecord;
  13 +import android.media.MediaRecorder;
  14 +import android.os.Build;
  15 +import android.os.IBinder;
  16 +import android.text.TextUtils;
  17 +import android.util.Log;
  18 +
  19 +import androidx.core.app.ActivityCompat;
  20 +import androidx.core.app.NotificationCompat;
  21 +
  22 +
  23 +import com.k2fsa.sherpa.onnx.AppViewModel;
  24 +import com.k2fsa.sherpa.onnx.Application;
  25 +
  26 +import com.k2fsa.sherpa.onnx.OnlineModelConfig;
  27 +import com.k2fsa.sherpa.onnx.OnlineRecognizer;
  28 +
  29 +import com.k2fsa.sherpa.onnx.OnlineRecognizerConfig;
  30 +import com.k2fsa.sherpa.onnx.OnlineStream;
  31 +import com.k2fsa.sherpa.onnx.OnlineTransducerModelConfig;
  32 +import com.k2fsa.sherpa.onnx.R;
  33 +
  34 +import java.io.File;
  35 +import java.io.FileOutputStream;
  36 +import java.io.IOException;
  37 +import java.io.InputStream;
  38 +import java.io.OutputStream;
  39 +
  40 +import java.util.Objects;
  41 +
  42 +import java.util.concurrent.ExecutorService;
  43 +import java.util.concurrent.Executors;
  44 +
  45 +
  46 +public class SpeechSherpaRecognitionService extends Service {
  47 +
  48 + private AppViewModel appViewModel;
  49 + private OnlineRecognizer recognizer;
  50 + private final int sampleRateInHz = 16000;
  51 +
  52 + private Thread recordingThread;
  53 + private boolean isRecording = false;
  54 + private int audioSource = MediaRecorder.AudioSource.MIC;
  55 + private int channelConfig = AudioFormat.CHANNEL_IN_MONO;
  56 + private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
  57 + private AudioRecord audioRecord;
  58 + private int idx = 0;
  59 + private String lastText = "";
  60 + private ExecutorService executor;
  61 +
  62 + @Override
  63 + public void onCreate() {
  64 + super.onCreate();
  65 + startForegroundService();
  66 + // 获取 ViewModel
  67 + appViewModel = Application.getInstance().getViewModel();
  68 + int numBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
  69 +
  70 + audioRecord = new AudioRecord(
  71 + audioSource,
  72 + sampleRateInHz,
  73 + channelConfig,
  74 + audioFormat,
  75 + numBytes * 2 // a sample has two bytes as we are using 16-bit PCM
  76 + );
  77 + executor = Executors.newSingleThreadExecutor();
  78 + executor.execute(this::initializeSherpa);
  79 + }
  80 +
  81 +
  82 + private void initializeSherpa() {
  83 + Log.d("Current Directory", System.getProperty("user.dir"));
  84 + String modelDir = "sherpa-onnx-streaming-zipformer-zh-14M-2023-02-23";
  85 + initializeSherpaDir(modelDir, modelDir);
  86 + OnlineTransducerModelConfig onlineTransducerModelConfig = OnlineTransducerModelConfig.builder()
  87 + .setEncoder(modelDir + "/encoder-epoch-99-avg-1.int8.onnx")
  88 + .setDecoder(modelDir + "/decoder-epoch-99-avg-1.onnx")
  89 + .setJoiner(modelDir + "/joiner-epoch-99-avg-1.int8.onnx")
  90 + .build();
  91 +
  92 + OnlineModelConfig onlineModelConfig = OnlineModelConfig.builder()
  93 + .setTransducer(onlineTransducerModelConfig)
  94 + .setTokens(modelDir + "/tokens.txt")
  95 + .setModelType("zipformer")
  96 + .build();
  97 + OnlineRecognizerConfig config = OnlineRecognizerConfig.builder()
  98 + .setOnlineModelConfig(onlineModelConfig)
  99 + .build();
  100 + recognizer = new OnlineRecognizer(getAssets(), config);
  101 +
  102 + audioRecord.startRecording();
  103 + startRecognition();
  104 + }
  105 +
  106 + private void startRecognition() {
  107 + isRecording = true;
  108 + recordingThread = new Thread(this::processSamples);
  109 + recordingThread.start();
  110 + }
  111 +
  112 + private void processSamples() {
  113 + OnlineStream stream = recognizer.createStream();
  114 + double interval = 0.1;
  115 + int bufferSize = (int) (interval * sampleRateInHz);
  116 + short[] buffer = new short[bufferSize];
  117 +
  118 + while (isRecording) {
  119 + int ret = audioRecord != null ? audioRecord.read(buffer, 0, buffer.length) : -1;
  120 + if (ret > 0) {
  121 + float[] samples = new float[ret];
  122 + for (int i = 0; i < ret; i++) {
  123 + samples[i] = buffer[i] / 32768.0f;
  124 + }
  125 + stream.acceptWaveform(samples, sampleRateInHz);
  126 + while (recognizer.isReady(stream)) {
  127 + recognizer.decode(stream);
  128 + }
  129 +
  130 + boolean isEndpoint = recognizer.isEndpoint(stream);
  131 + String text = recognizer.getResult(stream).getText();
  132 + if (isEndpoint) {
  133 + float[] tailPaddings = new float[(int) (0.8 * sampleRateInHz)];
  134 + stream.acceptWaveform(tailPaddings, sampleRateInHz);
  135 + while (recognizer.isReady(stream)) {
  136 + recognizer.decode(stream);
  137 + }
  138 + text = recognizer.getResult(stream).getText();
  139 + }
  140 +
  141 + String textToDisplay = lastText;
  142 +
  143 + if (!TextUtils.isEmpty(text)) {
  144 + textToDisplay = TextUtils.isEmpty(text) ? idx + ": " + text : lastText + "\n" + idx + ": " + text;
  145 + }
  146 +
  147 + if (isEndpoint) {
  148 + recognizer.reset(stream);
  149 + if (!TextUtils.isEmpty(text)) {
  150 + lastText = lastText + "\n" + idx + ": " + text;
  151 + textToDisplay = lastText;
  152 + idx += 1;
  153 + }
  154 + appViewModel.setSpeechRecognitionResult(textToDisplay);
  155 + }
  156 + }
  157 +
  158 + }
  159 + stream.release();
  160 +
  161 + }
  162 +
  163 +
  164 + @Override
  165 + public int onStartCommand(Intent intent, int flags, int startId) {
  166 +
  167 + return START_STICKY;
  168 + }
  169 +
  170 + @Override
  171 + public void onDestroy() {
  172 + super.onDestroy();
  173 + audioRecord.stop();
  174 + audioRecord.release();
  175 + executor.shutdown();
  176 + stopForeground(true);
  177 + }
  178 +
  179 + @Override
  180 + public IBinder onBind(Intent intent) {
  181 + return null;
  182 + }
  183 +
  184 +
  185 + private void startForegroundService() {
  186 + String channelId = createNotificationChannel();
  187 +
  188 + Notification notification = new NotificationCompat.Builder(this, channelId)
  189 + .setContentTitle("Foreground Service")
  190 + .setContentText("Running in the foreground")
  191 + .setSmallIcon(R.drawable.ic_bg_mic_24)
  192 + .build();
  193 +
  194 + startForeground(1, notification);
  195 + }
  196 +
  197 + // 创建通知渠道 (针对 Android 8.0 及以上版本)
  198 + private String createNotificationChannel() {
  199 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  200 + String channelId = "speech_channel";
  201 + String channelName = "Speech Channel";
  202 + NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_LOW);
  203 + NotificationManager manager = getSystemService(NotificationManager.class);
  204 + if (manager != null) {
  205 + manager.createNotificationChannel(channel);
  206 + }
  207 + return channelId;
  208 + } else {
  209 + return "";
  210 + }
  211 + }
  212 +
  213 + private void initializeSherpaDir(String assetDir, String internalDir) {
  214 + AssetManager assetManager = getAssets();
  215 + File outDir = new File(getFilesDir(), internalDir);
  216 +
  217 + if (!outDir.exists()) {
  218 + outDir.mkdirs();
  219 + }
  220 +
  221 + try {
  222 + String[] assets = assetManager.list(assetDir);
  223 + if (assets != null) {
  224 + for (String asset : assets) {
  225 + String assetPath = assetDir.isEmpty() ? asset : assetDir + "/" + asset;
  226 + File outFile = new File(outDir, asset);
  227 + if (Objects.requireNonNull(assetManager.list(assetPath)).length > 0) {
  228 + outFile.mkdirs();
  229 + initializeSherpaDir(assetPath, internalDir + "/" + asset); // 递归复制子目录
  230 + } else {
  231 + InputStream in = assetManager.open(assetPath);
  232 + OutputStream out = new FileOutputStream(outFile);
  233 +
  234 + byte[] buffer = new byte[1024];
  235 + int read;
  236 + while ((read = in.read(buffer)) != -1) {
  237 + out.write(buffer, 0, read);
  238 + }
  239 +
  240 + in.close();
  241 + out.flush();
  242 + out.close();
  243 + }
  244 + }
  245 + }
  246 + } catch (IOException e) {
  247 + Log.e("ModelCopy", "Failed to copy assets", e);
  248 + }
  249 + }
  250 +}
  1 +<vector xmlns:android="http://schemas.android.com/apk/res/android"
  2 + xmlns:aapt="http://schemas.android.com/aapt"
  3 + android:width="108dp"
  4 + android:height="108dp"
  5 + android:viewportWidth="108"
  6 + android:viewportHeight="108">
  7 + <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
  8 + <aapt:attr name="android:fillColor">
  9 + <gradient
  10 + android:endX="85.84757"
  11 + android:endY="92.4963"
  12 + android:startX="42.9492"
  13 + android:startY="49.59793"
  14 + android:type="linear">
  15 + <item
  16 + android:color="#44000000"
  17 + android:offset="0.0" />
  18 + <item
  19 + android:color="#00000000"
  20 + android:offset="1.0" />
  21 + </gradient>
  22 + </aapt:attr>
  23 + </path>
  24 + <path
  25 + android:fillColor="#FFFFFF"
  26 + android:fillType="nonZero"
  27 + android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
  28 + android:strokeWidth="1"
  29 + android:strokeColor="#00000000" />
  30 +</vector>
  1 +<vector android:height="24dp" android:tint="#000000"
  2 + android:viewportHeight="24" android:viewportWidth="24"
  3 + android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
  4 + <path android:fillColor="@android:color/white" android:pathData="M12,14c1.66,0 2.99,-1.34 2.99,-3L15,5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v6c0,1.66 1.34,3 3,3zM17.3,11c0,3 -2.54,5.1 -5.3,5.1S6.7,14 6.7,11L5,11c0,3.41 2.72,6.23 6,6.72L11,21h2v-3.28c3.28,-0.48 6,-3.3 6,-6.72h-1.7z"/>
  5 +</vector>
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<vector xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:width="108dp"
  4 + android:height="108dp"
  5 + android:viewportWidth="108"
  6 + android:viewportHeight="108">
  7 + <path
  8 + android:fillColor="#3DDC84"
  9 + android:pathData="M0,0h108v108h-108z" />
  10 + <path
  11 + android:fillColor="#00000000"
  12 + android:pathData="M9,0L9,108"
  13 + android:strokeWidth="0.8"
  14 + android:strokeColor="#33FFFFFF" />
  15 + <path
  16 + android:fillColor="#00000000"
  17 + android:pathData="M19,0L19,108"
  18 + android:strokeWidth="0.8"
  19 + android:strokeColor="#33FFFFFF" />
  20 + <path
  21 + android:fillColor="#00000000"
  22 + android:pathData="M29,0L29,108"
  23 + android:strokeWidth="0.8"
  24 + android:strokeColor="#33FFFFFF" />
  25 + <path
  26 + android:fillColor="#00000000"
  27 + android:pathData="M39,0L39,108"
  28 + android:strokeWidth="0.8"
  29 + android:strokeColor="#33FFFFFF" />
  30 + <path
  31 + android:fillColor="#00000000"
  32 + android:pathData="M49,0L49,108"
  33 + android:strokeWidth="0.8"
  34 + android:strokeColor="#33FFFFFF" />
  35 + <path
  36 + android:fillColor="#00000000"
  37 + android:pathData="M59,0L59,108"
  38 + android:strokeWidth="0.8"
  39 + android:strokeColor="#33FFFFFF" />
  40 + <path
  41 + android:fillColor="#00000000"
  42 + android:pathData="M69,0L69,108"
  43 + android:strokeWidth="0.8"
  44 + android:strokeColor="#33FFFFFF" />
  45 + <path
  46 + android:fillColor="#00000000"
  47 + android:pathData="M79,0L79,108"
  48 + android:strokeWidth="0.8"
  49 + android:strokeColor="#33FFFFFF" />
  50 + <path
  51 + android:fillColor="#00000000"
  52 + android:pathData="M89,0L89,108"
  53 + android:strokeWidth="0.8"
  54 + android:strokeColor="#33FFFFFF" />
  55 + <path
  56 + android:fillColor="#00000000"
  57 + android:pathData="M99,0L99,108"
  58 + android:strokeWidth="0.8"
  59 + android:strokeColor="#33FFFFFF" />
  60 + <path
  61 + android:fillColor="#00000000"
  62 + android:pathData="M0,9L108,9"
  63 + android:strokeWidth="0.8"
  64 + android:strokeColor="#33FFFFFF" />
  65 + <path
  66 + android:fillColor="#00000000"
  67 + android:pathData="M0,19L108,19"
  68 + android:strokeWidth="0.8"
  69 + android:strokeColor="#33FFFFFF" />
  70 + <path
  71 + android:fillColor="#00000000"
  72 + android:pathData="M0,29L108,29"
  73 + android:strokeWidth="0.8"
  74 + android:strokeColor="#33FFFFFF" />
  75 + <path
  76 + android:fillColor="#00000000"
  77 + android:pathData="M0,39L108,39"
  78 + android:strokeWidth="0.8"
  79 + android:strokeColor="#33FFFFFF" />
  80 + <path
  81 + android:fillColor="#00000000"
  82 + android:pathData="M0,49L108,49"
  83 + android:strokeWidth="0.8"
  84 + android:strokeColor="#33FFFFFF" />
  85 + <path
  86 + android:fillColor="#00000000"
  87 + android:pathData="M0,59L108,59"
  88 + android:strokeWidth="0.8"
  89 + android:strokeColor="#33FFFFFF" />
  90 + <path
  91 + android:fillColor="#00000000"
  92 + android:pathData="M0,69L108,69"
  93 + android:strokeWidth="0.8"
  94 + android:strokeColor="#33FFFFFF" />
  95 + <path
  96 + android:fillColor="#00000000"
  97 + android:pathData="M0,79L108,79"
  98 + android:strokeWidth="0.8"
  99 + android:strokeColor="#33FFFFFF" />
  100 + <path
  101 + android:fillColor="#00000000"
  102 + android:pathData="M0,89L108,89"
  103 + android:strokeWidth="0.8"
  104 + android:strokeColor="#33FFFFFF" />
  105 + <path
  106 + android:fillColor="#00000000"
  107 + android:pathData="M0,99L108,99"
  108 + android:strokeWidth="0.8"
  109 + android:strokeColor="#33FFFFFF" />
  110 + <path
  111 + android:fillColor="#00000000"
  112 + android:pathData="M19,29L89,29"
  113 + android:strokeWidth="0.8"
  114 + android:strokeColor="#33FFFFFF" />
  115 + <path
  116 + android:fillColor="#00000000"
  117 + android:pathData="M19,39L89,39"
  118 + android:strokeWidth="0.8"
  119 + android:strokeColor="#33FFFFFF" />
  120 + <path
  121 + android:fillColor="#00000000"
  122 + android:pathData="M19,49L89,49"
  123 + android:strokeWidth="0.8"
  124 + android:strokeColor="#33FFFFFF" />
  125 + <path
  126 + android:fillColor="#00000000"
  127 + android:pathData="M19,59L89,59"
  128 + android:strokeWidth="0.8"
  129 + android:strokeColor="#33FFFFFF" />
  130 + <path
  131 + android:fillColor="#00000000"
  132 + android:pathData="M19,69L89,69"
  133 + android:strokeWidth="0.8"
  134 + android:strokeColor="#33FFFFFF" />
  135 + <path
  136 + android:fillColor="#00000000"
  137 + android:pathData="M19,79L89,79"
  138 + android:strokeWidth="0.8"
  139 + android:strokeColor="#33FFFFFF" />
  140 + <path
  141 + android:fillColor="#00000000"
  142 + android:pathData="M29,19L29,89"
  143 + android:strokeWidth="0.8"
  144 + android:strokeColor="#33FFFFFF" />
  145 + <path
  146 + android:fillColor="#00000000"
  147 + android:pathData="M39,19L39,89"
  148 + android:strokeWidth="0.8"
  149 + android:strokeColor="#33FFFFFF" />
  150 + <path
  151 + android:fillColor="#00000000"
  152 + android:pathData="M49,19L49,89"
  153 + android:strokeWidth="0.8"
  154 + android:strokeColor="#33FFFFFF" />
  155 + <path
  156 + android:fillColor="#00000000"
  157 + android:pathData="M59,19L59,89"
  158 + android:strokeWidth="0.8"
  159 + android:strokeColor="#33FFFFFF" />
  160 + <path
  161 + android:fillColor="#00000000"
  162 + android:pathData="M69,19L69,89"
  163 + android:strokeWidth="0.8"
  164 + android:strokeColor="#33FFFFFF" />
  165 + <path
  166 + android:fillColor="#00000000"
  167 + android:pathData="M79,19L79,89"
  168 + android:strokeWidth="0.8"
  169 + android:strokeColor="#33FFFFFF" />
  170 +</vector>
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + xmlns:app="http://schemas.android.com/apk/res-auto"
  4 + xmlns:tools="http://schemas.android.com/tools"
  5 + android:layout_width="match_parent"
  6 + android:layout_height="match_parent"
  7 + tools:context=".MainActivity">
  8 +
  9 + <TextView
  10 + android:id="@+id/text"
  11 + android:layout_width="wrap_content"
  12 + android:layout_height="wrap_content"
  13 + android:text="Hello World!"
  14 +
  15 + app:layout_constraintStart_toStartOf="parent"
  16 + app:layout_constraintTop_toTopOf="parent" />
  17 +
  18 +</androidx.constraintlayout.widget.ConstraintLayout>
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <background android:drawable="@drawable/ic_launcher_background" />
  4 + <foreground android:drawable="@drawable/ic_launcher_foreground" />
  5 +</adaptive-icon>
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <background android:drawable="@drawable/ic_launcher_background" />
  4 + <foreground android:drawable="@drawable/ic_launcher_foreground" />
  5 +</adaptive-icon>
  1 +<resources xmlns:tools="http://schemas.android.com/tools">
  2 + <!-- Base application theme. -->
  3 + <style name="Theme.SherpaOnnxJavaDemo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
  4 + <!-- Primary brand color. -->
  5 + <item name="colorPrimary">@color/purple_200</item>
  6 + <item name="colorPrimaryVariant">@color/purple_700</item>
  7 + <item name="colorOnPrimary">@color/black</item>
  8 + <!-- Secondary brand color. -->
  9 + <item name="colorSecondary">@color/teal_200</item>
  10 + <item name="colorSecondaryVariant">@color/teal_200</item>
  11 + <item name="colorOnSecondary">@color/black</item>
  12 + <!-- Status bar color. -->
  13 + <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
  14 + <!-- Customize your theme here. -->
  15 + </style>
  16 +</resources>
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 + <color name="purple_200">#FFBB86FC</color>
  4 + <color name="purple_500">#FF6200EE</color>
  5 + <color name="purple_700">#FF3700B3</color>
  6 + <color name="teal_200">#FF03DAC5</color>
  7 + <color name="teal_700">#FF018786</color>
  8 + <color name="black">#FF000000</color>
  9 + <color name="white">#FFFFFFFF</color>
  10 +</resources>
  1 +<resources>
  2 + <string name="app_name">SherpaOnnxJavaDemo</string>
  3 +</resources>
  1 +<resources xmlns:tools="http://schemas.android.com/tools">
  2 + <!-- Base application theme. -->
  3 + <style name="Theme.SherpaOnnxJavaDemo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
  4 + <!-- Primary brand color. -->
  5 + <item name="colorPrimary">@color/purple_500</item>
  6 + <item name="colorPrimaryVariant">@color/purple_700</item>
  7 + <item name="colorOnPrimary">@color/white</item>
  8 + <!-- Secondary brand color. -->
  9 + <item name="colorSecondary">@color/teal_200</item>
  10 + <item name="colorSecondaryVariant">@color/teal_700</item>
  11 + <item name="colorOnSecondary">@color/black</item>
  12 + <!-- Status bar color. -->
  13 + <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
  14 + <!-- Customize your theme here. -->
  15 + </style>
  16 +</resources>
  1 +<?xml version="1.0" encoding="utf-8"?><!--
  2 + Sample backup rules file; uncomment and customize as necessary.
  3 + See https://developer.android.com/guide/topics/data/autobackup
  4 + for details.
  5 + Note: This file is ignored for devices older that API 31
  6 + See https://developer.android.com/about/versions/12/backup-restore
  7 +-->
  8 +<full-backup-content>
  9 + <!--
  10 + <include domain="sharedpref" path="."/>
  11 + <exclude domain="sharedpref" path="device.xml"/>
  12 +-->
  13 +</full-backup-content>
  1 +<?xml version="1.0" encoding="utf-8"?><!--
  2 + Sample data extraction rules file; uncomment and customize as necessary.
  3 + See https://developer.android.com/about/versions/12/backup-restore#xml-changes
  4 + for details.
  5 +-->
  6 +<data-extraction-rules>
  7 + <cloud-backup>
  8 + <!-- TODO: Use <include> and <exclude> to control what is backed up.
  9 + <include .../>
  10 + <exclude .../>
  11 + -->
  12 + </cloud-backup>
  13 + <!--
  14 + <device-transfer>
  15 + <include .../>
  16 + <exclude .../>
  17 + </device-transfer>
  18 + -->
  19 +</data-extraction-rules>
  1 +// Top-level build file where you can add configuration options common to all sub-projects/modules.
  2 +plugins {
  3 + id 'com.android.application' version '7.2.2' apply false
  4 + id 'com.android.library' version '7.2.2' apply false
  5 +}
  6 +
  7 +task clean(type: Delete) {
  8 + delete rootProject.buildDir
  9 +}
  1 +# Project-wide Gradle settings.
  2 +# IDE (e.g. Android Studio) users:
  3 +# Gradle settings configured through the IDE *will override*
  4 +# any settings specified in this file.
  5 +# For more details on how to configure your build environment visit
  6 +# http://www.gradle.org/docs/current/userguide/build_environment.html
  7 +# Specifies the JVM arguments used for the daemon process.
  8 +# The setting is particularly useful for tweaking memory settings.
  9 +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
  10 +# When configured, Gradle will run in incubating parallel mode.
  11 +# This option should only be used with decoupled projects. More details, visit
  12 +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
  13 +# org.gradle.parallel=true
  14 +# AndroidX package structure to make it clearer which packages are bundled with the
  15 +# Android operating system, and which are packaged with your app"s APK
  16 +# https://developer.android.com/topic/libraries/support-library/androidx-rn
  17 +android.useAndroidX=true
  18 +# Enables namespacing of each library's R class so that its R class includes only the
  19 +# resources declared in the library itself and none from the library's dependencies,
  20 +# thereby reducing the size of the R class for that library
  21 +android.nonTransitiveRClass=true
  1 +#Tue Oct 22 10:59:18 CST 2024
  2 +distributionBase=GRADLE_USER_HOME
  3 +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
  4 +distributionPath=wrapper/dists
  5 +zipStorePath=wrapper/dists
  6 +zipStoreBase=GRADLE_USER_HOME
  1 +#!/usr/bin/env sh
  2 +
  3 +#
  4 +# Copyright 2015 the original author or authors.
  5 +#
  6 +# Licensed under the Apache License, Version 2.0 (the "License");
  7 +# you may not use this file except in compliance with the License.
  8 +# You may obtain a copy of the License at
  9 +#
  10 +# https://www.apache.org/licenses/LICENSE-2.0
  11 +#
  12 +# Unless required by applicable law or agreed to in writing, software
  13 +# distributed under the License is distributed on an "AS IS" BASIS,
  14 +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15 +# See the License for the specific language governing permissions and
  16 +# limitations under the License.
  17 +#
  18 +
  19 +##############################################################################
  20 +##
  21 +## Gradle start up script for UN*X
  22 +##
  23 +##############################################################################
  24 +
  25 +# Attempt to set APP_HOME
  26 +# Resolve links: $0 may be a link
  27 +PRG="$0"
  28 +# Need this for relative symlinks.
  29 +while [ -h "$PRG" ] ; do
  30 + ls=`ls -ld "$PRG"`
  31 + link=`expr "$ls" : '.*-> \(.*\)$'`
  32 + if expr "$link" : '/.*' > /dev/null; then
  33 + PRG="$link"
  34 + else
  35 + PRG=`dirname "$PRG"`"/$link"
  36 + fi
  37 +done
  38 +SAVED="`pwd`"
  39 +cd "`dirname \"$PRG\"`/" >/dev/null
  40 +APP_HOME="`pwd -P`"
  41 +cd "$SAVED" >/dev/null
  42 +
  43 +APP_NAME="Gradle"
  44 +APP_BASE_NAME=`basename "$0"`
  45 +
  46 +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  47 +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
  48 +
  49 +# Use the maximum available, or set MAX_FD != -1 to use that value.
  50 +MAX_FD="maximum"
  51 +
  52 +warn () {
  53 + echo "$*"
  54 +}
  55 +
  56 +die () {
  57 + echo
  58 + echo "$*"
  59 + echo
  60 + exit 1
  61 +}
  62 +
  63 +# OS specific support (must be 'true' or 'false').
  64 +cygwin=false
  65 +msys=false
  66 +darwin=false
  67 +nonstop=false
  68 +case "`uname`" in
  69 + CYGWIN* )
  70 + cygwin=true
  71 + ;;
  72 + Darwin* )
  73 + darwin=true
  74 + ;;
  75 + MINGW* )
  76 + msys=true
  77 + ;;
  78 + NONSTOP* )
  79 + nonstop=true
  80 + ;;
  81 +esac
  82 +
  83 +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
  84 +
  85 +
  86 +# Determine the Java command to use to start the JVM.
  87 +if [ -n "$JAVA_HOME" ] ; then
  88 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
  89 + # IBM's JDK on AIX uses strange locations for the executables
  90 + JAVACMD="$JAVA_HOME/jre/sh/java"
  91 + else
  92 + JAVACMD="$JAVA_HOME/bin/java"
  93 + fi
  94 + if [ ! -x "$JAVACMD" ] ; then
  95 + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
  96 +
  97 +Please set the JAVA_HOME variable in your environment to match the
  98 +location of your Java installation."
  99 + fi
  100 +else
  101 + JAVACMD="java"
  102 + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
  103 +
  104 +Please set the JAVA_HOME variable in your environment to match the
  105 +location of your Java installation."
  106 +fi
  107 +
  108 +# Increase the maximum file descriptors if we can.
  109 +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
  110 + MAX_FD_LIMIT=`ulimit -H -n`
  111 + if [ $? -eq 0 ] ; then
  112 + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
  113 + MAX_FD="$MAX_FD_LIMIT"
  114 + fi
  115 + ulimit -n $MAX_FD
  116 + if [ $? -ne 0 ] ; then
  117 + warn "Could not set maximum file descriptor limit: $MAX_FD"
  118 + fi
  119 + else
  120 + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
  121 + fi
  122 +fi
  123 +
  124 +# For Darwin, add options to specify how the application appears in the dock
  125 +if $darwin; then
  126 + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
  127 +fi
  128 +
  129 +# For Cygwin or MSYS, switch paths to Windows format before running java
  130 +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
  131 + APP_HOME=`cygpath --path --mixed "$APP_HOME"`
  132 + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
  133 +
  134 + JAVACMD=`cygpath --unix "$JAVACMD"`
  135 +
  136 + # We build the pattern for arguments to be converted via cygpath
  137 + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
  138 + SEP=""
  139 + for dir in $ROOTDIRSRAW ; do
  140 + ROOTDIRS="$ROOTDIRS$SEP$dir"
  141 + SEP="|"
  142 + done
  143 + OURCYGPATTERN="(^($ROOTDIRS))"
  144 + # Add a user-defined pattern to the cygpath arguments
  145 + if [ "$GRADLE_CYGPATTERN" != "" ] ; then
  146 + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
  147 + fi
  148 + # Now convert the arguments - kludge to limit ourselves to /bin/sh
  149 + i=0
  150 + for arg in "$@" ; do
  151 + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
  152 + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
  153 +
  154 + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
  155 + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
  156 + else
  157 + eval `echo args$i`="\"$arg\""
  158 + fi
  159 + i=`expr $i + 1`
  160 + done
  161 + case $i in
  162 + 0) set -- ;;
  163 + 1) set -- "$args0" ;;
  164 + 2) set -- "$args0" "$args1" ;;
  165 + 3) set -- "$args0" "$args1" "$args2" ;;
  166 + 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
  167 + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
  168 + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
  169 + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
  170 + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
  171 + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
  172 + esac
  173 +fi
  174 +
  175 +# Escape application args
  176 +save () {
  177 + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
  178 + echo " "
  179 +}
  180 +APP_ARGS=`save "$@"`
  181 +
  182 +# Collect all arguments for the java command, following the shell quoting and substitution rules
  183 +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
  184 +
  185 +exec "$JAVACMD" "$@"
  1 +@rem
  2 +@rem Copyright 2015 the original author or authors.
  3 +@rem
  4 +@rem Licensed under the Apache License, Version 2.0 (the "License");
  5 +@rem you may not use this file except in compliance with the License.
  6 +@rem You may obtain a copy of the License at
  7 +@rem
  8 +@rem https://www.apache.org/licenses/LICENSE-2.0
  9 +@rem
  10 +@rem Unless required by applicable law or agreed to in writing, software
  11 +@rem distributed under the License is distributed on an "AS IS" BASIS,
  12 +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 +@rem See the License for the specific language governing permissions and
  14 +@rem limitations under the License.
  15 +@rem
  16 +
  17 +@if "%DEBUG%" == "" @echo off
  18 +@rem ##########################################################################
  19 +@rem
  20 +@rem Gradle startup script for Windows
  21 +@rem
  22 +@rem ##########################################################################
  23 +
  24 +@rem Set local scope for the variables with windows NT shell
  25 +if "%OS%"=="Windows_NT" setlocal
  26 +
  27 +set DIRNAME=%~dp0
  28 +if "%DIRNAME%" == "" set DIRNAME=.
  29 +set APP_BASE_NAME=%~n0
  30 +set APP_HOME=%DIRNAME%
  31 +
  32 +@rem Resolve any "." and ".." in APP_HOME to make it shorter.
  33 +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
  34 +
  35 +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  36 +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
  37 +
  38 +@rem Find java.exe
  39 +if defined JAVA_HOME goto findJavaFromJavaHome
  40 +
  41 +set JAVA_EXE=java.exe
  42 +%JAVA_EXE% -version >NUL 2>&1
  43 +if "%ERRORLEVEL%" == "0" goto execute
  44 +
  45 +echo.
  46 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
  47 +echo.
  48 +echo Please set the JAVA_HOME variable in your environment to match the
  49 +echo location of your Java installation.
  50 +
  51 +goto fail
  52 +
  53 +:findJavaFromJavaHome
  54 +set JAVA_HOME=%JAVA_HOME:"=%
  55 +set JAVA_EXE=%JAVA_HOME%/bin/java.exe
  56 +
  57 +if exist "%JAVA_EXE%" goto execute
  58 +
  59 +echo.
  60 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
  61 +echo.
  62 +echo Please set the JAVA_HOME variable in your environment to match the
  63 +echo location of your Java installation.
  64 +
  65 +goto fail
  66 +
  67 +:execute
  68 +@rem Setup the command line
  69 +
  70 +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
  71 +
  72 +
  73 +@rem Execute Gradle
  74 +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
  75 +
  76 +:end
  77 +@rem End local scope for the variables with windows NT shell
  78 +if "%ERRORLEVEL%"=="0" goto mainEnd
  79 +
  80 +:fail
  81 +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
  82 +rem the _cmd.exe /c_ return code!
  83 +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
  84 +exit /b 1
  85 +
  86 +:mainEnd
  87 +if "%OS%"=="Windows_NT" endlocal
  88 +
  89 +:omega
  1 +pluginManagement {
  2 + repositories {
  3 + gradlePluginPortal()
  4 + google()
  5 + mavenCentral()
  6 + }
  7 +}
  8 +dependencyResolutionManagement {
  9 + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  10 + repositories {
  11 + google()
  12 + mavenCentral()
  13 + }
  14 +}
  15 +rootProject.name = "SherpaOnnxJavaDemo"
  16 +include ':app'
  17 +include ':sherpa'
  1 +plugins {
  2 + id 'com.android.library'
  3 +}
  4 +
  5 +android {
  6 + namespace 'com.k2fsa.sherpa'
  7 + compileSdk 34
  8 +
  9 + defaultConfig {
  10 + minSdk 26
  11 + targetSdk 27
  12 + versionCode 1
  13 + versionName "1.0"
  14 + missingDimensionStrategy 'base', 'feature1'
  15 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  16 + }
  17 +
  18 + buildTypes {
  19 + release {
  20 + minifyEnabled false
  21 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  22 + }
  23 + }
  24 + compileOptions {
  25 + sourceCompatibility JavaVersion.VERSION_1_8
  26 + targetCompatibility JavaVersion.VERSION_1_8
  27 + }
  28 +}
  29 +
  30 +dependencies {
  31 +
  32 +// implementation "androidx.appcompat"
  33 +// implementation libs.material
  34 +// testImplementation libs.junit
  35 +// androidTestImplementation libs.androidx.test.ext.junit
  36 +// androidTestImplementation libs.espresso.core
  37 + implementation 'androidx.appcompat:appcompat:1.6.1'
  38 + implementation 'com.google.android.material:material:1.9.0'
  39 + testImplementation 'junit:junit:4.13.2'
  40 + androidTestImplementation 'androidx.test.ext:junit:1.1.5'
  41 + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
  42 +
  43 +}
  1 +# Add project specific ProGuard rules here.
  2 +# You can control the set of applied configuration files using the
  3 +# proguardFiles setting in build.gradle.
  4 +#
  5 +# For more details, see
  6 +# http://developer.android.com/guide/developing/tools/proguard.html
  7 +
  8 +# If your project uses WebView with JS, uncomment the following
  9 +# and specify the fully qualified class name to the JavaScript interface
  10 +# class:
  11 +#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
  12 +# public *;
  13 +#}
  14 +
  15 +# Uncomment this to preserve the line number information for
  16 +# debugging stack traces.
  17 +#-keepattributes SourceFile,LineNumberTable
  18 +
  19 +# If you keep the line number information, uncomment this to
  20 +# hide the original source file name.
  21 +#-renamesourcefileattribute SourceFile
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  3 +
  4 + <application
  5 + android:allowBackup="true"
  6 + android:label="@string/app_name"
  7 + android:supportsRtl="true" />
  8 +
  9 +</manifest>
  1 +../../../../../../../sherpa-onnx/sherpa-onnx/java-api/src/com
  1 +<resources>
  2 + <string name="app_name">sherpa</string>
  3 +</resources>