@@ -18,6 +18,10 @@ const ORT_VERSION: &str = "1.13.1";
1818/// Base Url from which to download pre-built releases/
1919const ORT_RELEASE_BASE_URL : & str = "https://github.com/microsoft/onnxruntime/releases/download" ;
2020
21+ /// Base Url from which to download pre-built releases for android/
22+ const ORT_MAVEN_RELEASE_BASE_URL : & str =
23+ "https://repo1.maven.org/maven2/com/microsoft/onnxruntime/onnxruntime-android" ;
24+
2125/// Environment variable selecting which strategy to use for finding the library
2226/// Possibilities:
2327/// * "download": Download a pre-built library from upstream. This is the default if `ORT_STRATEGY` is not set.
@@ -63,11 +67,21 @@ fn main() {
6367fn main ( ) {
6468 let libort_install_dir = prepare_libort_dir ( ) ;
6569
70+ // FIXME: directmlとandroidで処理の表現が違うので統一する
6671 #[ cfg( not( feature = "directml" ) ) ]
67- let ( include_dir, lib_dir) = (
68- libort_install_dir. join ( "include" ) ,
69- libort_install_dir. join ( "lib" ) ,
70- ) ;
72+ let ( include_dir, lib_dir) = match TRIPLET . os {
73+ Os :: Android => {
74+ let include_dir = libort_install_dir. join ( "headers" ) ;
75+ let runtimes_dir = libort_install_dir
76+ . join ( "jni" )
77+ . join ( & * TRIPLET . arch . as_onnx_android_str ( ) ) ;
78+ ( include_dir, runtimes_dir)
79+ }
80+ _ => (
81+ libort_install_dir. join ( "include" ) ,
82+ libort_install_dir. join ( "lib" ) ,
83+ ) ,
84+ } ;
7185
7286 #[ cfg( feature = "directml" ) ]
7387 let ( include_dir, lib_dir) = {
@@ -265,6 +279,7 @@ fn extract_archive(filename: &Path, output: &Path) {
265279 match filename. extension ( ) . map ( |e| e. to_str ( ) ) {
266280 Some ( Some ( "zip" ) ) => extract_zip ( filename, output) ,
267281 Some ( Some ( "tgz" ) ) => extract_tgz ( filename, output) ,
282+ Some ( Some ( "aar" ) ) => extract_zip ( filename, output) ,
268283 _ => unimplemented ! ( ) ,
269284 }
270285}
@@ -349,6 +364,15 @@ impl Architecture {
349364 Architecture :: Arm64 => Cow :: from ( "arm64" ) ,
350365 }
351366 }
367+
368+ fn as_onnx_android_str ( & self ) -> Cow < str > {
369+ match self {
370+ Architecture :: X86 => Cow :: from ( "x86" ) ,
371+ Architecture :: X86_64 => Cow :: from ( "x86_64" ) ,
372+ Architecture :: Arm => Cow :: from ( "armeabi-v7a" ) ,
373+ Architecture :: Arm64 => Cow :: from ( "arm64-v8a" ) ,
374+ }
375+ }
352376}
353377
354378#[ derive( Debug ) ]
@@ -357,6 +381,7 @@ enum Os {
357381 Windows ,
358382 Linux ,
359383 MacOs ,
384+ Android ,
360385}
361386
362387impl Os {
@@ -365,6 +390,7 @@ impl Os {
365390 Os :: Windows => "zip" ,
366391 Os :: Linux => "tgz" ,
367392 Os :: MacOs => "tgz" ,
393+ Os :: Android => "aar" ,
368394 }
369395 }
370396}
@@ -377,6 +403,7 @@ impl FromStr for Os {
377403 "windows" => Ok ( Os :: Windows ) ,
378404 "macos" => Ok ( Os :: MacOs ) ,
379405 "linux" => Ok ( Os :: Linux ) ,
406+ "android" => Ok ( Os :: Android ) ,
380407 _ => Err ( format ! ( "Unsupported os: {}" , s) ) ,
381408 }
382409 }
@@ -388,6 +415,7 @@ impl OnnxPrebuiltArchive for Os {
388415 Os :: Windows => Cow :: from ( "win" ) ,
389416 Os :: Linux => Cow :: from ( "linux" ) ,
390417 Os :: MacOs => Cow :: from ( "osx" ) ,
418+ Os :: Android => Cow :: from ( "android" ) ,
391419 }
392420 }
393421}
@@ -436,6 +464,7 @@ impl OnnxPrebuiltArchive for Triplet {
436464 }
437465 ( Os :: Windows , Architecture :: X86 , Accelerator :: None )
438466 | ( Os :: MacOs , Architecture :: X86_64 , Accelerator :: None )
467+ | ( Os :: Android , Architecture :: Arm64 , Accelerator :: None )
439468 | ( Os :: Linux , Architecture :: Arm64 , Accelerator :: None ) => Cow :: from ( format ! (
440469 "{}-{}" ,
441470 self . os. as_onnx_str( ) ,
@@ -484,11 +513,19 @@ fn prebuilt_archive_url() -> (PathBuf, String) {
484513 ORT_VERSION ,
485514 TRIPLET . os. archive_extension( )
486515 ) ;
487- let prebuilt_url = format ! (
488- "{}/v{}/{}" ,
489- ORT_RELEASE_BASE_URL , ORT_VERSION , prebuilt_archive
490- ) ;
491-
516+ let prebuilt_url = match TRIPLET . os {
517+ Os :: Android => format ! (
518+ "{}/{}/onnxruntime-android-{}.{}" ,
519+ ORT_MAVEN_RELEASE_BASE_URL ,
520+ ORT_VERSION ,
521+ ORT_VERSION ,
522+ TRIPLET . os. archive_extension( )
523+ ) ,
524+ _ => format ! (
525+ "{}/v{}/{}" ,
526+ ORT_RELEASE_BASE_URL , ORT_VERSION , prebuilt_archive
527+ ) ,
528+ } ;
492529 ( PathBuf :: from ( prebuilt_archive) , prebuilt_url)
493530}
494531
@@ -534,7 +571,10 @@ fn prepare_libort_dir_prebuilt() -> PathBuf {
534571 // directmlの場合はzipの子ディレクトリがzipファイル名のディレクトリではないため、
535572 // この処理は非directmlの場合のみ行う
536573 #[ cfg( not( feature = "directml" ) ) ]
537- let extract_dir = extract_dir. join ( prebuilt_archive. file_stem ( ) . unwrap ( ) ) ;
574+ let extract_dir = match TRIPLET . os {
575+ Os :: Android => extract_dir,
576+ _ => extract_dir. join ( prebuilt_archive. file_stem ( ) . unwrap ( ) ) ,
577+ } ;
538578
539579 extract_dir
540580}
0 commit comments