GithubHelp home page GithubHelp logo

ndk's Introduction

ci MIT license APACHE2 license

Rust bindings to the Android NDK

Name Description Badges
ndk-sys Raw FFI bindings to the NDK crates.io Docs MSRV
ndk Safe abstraction of the bindings crates.io Docs MSRV

See these ndk-examples and these rust-android-examples for examples using the NDK.

Important

This repository was recently modularized and the following crates were split into separate repositories:

Crate New Location Notes
ndk-context https://github.com/rust-mobile/ndk-context
ndk-glue https://github.com/rust-mobile/ndk-glue deprecated - see android-activity
ndk-macro https://github.com/rust-mobile/ndk-glue deprecated - see android-activity
ndk-build https://github.com/rust-mobile/cargo-apk deprecated - see xbuild
cargo-apk https://github.com/rust-mobile/cargo-apk deprecated - see xbuild

ndk's People

Contributors

atilogit avatar bjorn3 avatar daxpedda avatar dvc94ch avatar exrook avatar francesca64 avatar goddessfreya avatar hrydgard avatar iamtommo avatar jake-shadle avatar jasper-bekkers avatar jasperdesutter avatar katyo avatar korejan avatar lattice0 avatar maciejgodek avatar marijns95 avatar maxded avatar mb64 avatar msiglreith avatar optimisticpeach avatar osspial avatar ragnarlistig avatar rib avatar rodrigodd avatar spencercw avatar vzout avatar xzenodart avatar zarik5 avatar zer0def avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ndk's Issues

ndk-glue: impossible to poll events in a non-blocking fashion

it's impossible to poll events in ndk-glue without blocking the thread. In the NDK samples I have seen ALooper is used to poll events with a timeout value that can be configured to block or not. Where the ndk-glue module will read the file descriptor directly with a blocking call. This makes it impossible to program games, or any application that wants to keep running without having to block for events/input.

Crash if not adding a logger

Hello, when attempting to run the winit example for request_redraw_threaded, if you comment out the simple_logger line it crashes, although the example runs fine in desktop etc so i dont think it's a problem with winit itself

minifed to just the example and it crashing:
https://github.com/Dispersia/test_android

and i can't get it to work in any way against master, so I don't know if it still occurs:
https://github.com/Dispersia/test_android/tree/against_master

Error received:

--------- beginning of crash
08-09 14:35:44.660  2471  2501 F libc    : FORTIFY: pthread_mutex_lock called on a destroyed mutex (0xf34eb018)
08-09 14:35:44.661  2471  2501 F libc    : Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 2501 (RenderThread), pid 2471 (le.test_example)
08-09 14:35:44.686  2471  2502 I RustStdoutStderr: FORTIFY: pthread_mutex_lock called on a destroyed mutex (0xf3531074)
08-09 14:35:44.686  2471  2471 F libc    : FORTIFY: pthread_mutex_lock called on a destroyed mutex (0xf3531074)
08-09 14:35:44.690  2507  2507 E DEBUG   : failed to open directory /proc/2501/fd: No such file or directory
08-09 14:35:44.691  2507  2507 F crash_dump32: crash_dump.cpp:443] failed to get process threads: No such file or directory
08-09 14:35:44.691  1910  1910 I /system/bin/tombstoned: received crash request for pid 2501
08-09 14:35:44.691  1839  1839 I Zygote  : Process 2471 exited cleanly (0)
08-09 14:35:44.691  1910  1910 W /system/bin/tombstoned: crash socket received short read of length 0 (expected 12)
08-09 14:35:44.694  2753  3985 I Icing   : IndexChimeraService.getServiceInterface callingPackage=com.google.android.gms componentName=null serviceId=30
08-09 14:35:44.718  2108  2204 W InputDispatcher: channel '46bfb3d rust.example.test_example/android.app.NativeActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
08-09 14:35:44.718  2108  2204 E InputDispatcher: channel '46bfb3d rust.example.test_example/android.app.NativeActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
08-09 14:35:44.719  2108  7451 I ActivityManager: Process rust.example.test_example (pid 2471) has died: fore TOP
08-09 14:35:44.720  2108  7942 I WindowManager: WIN DEATH: Window{46bfb3d u0 rust.example.test_example/android.app.NativeActivity}
08-09 14:35:44.720  2108  7942 W InputDispatcher: Attempted to unregister already unregistered input channel '46bfb3d rust.example.test_example/android.app.NativeActivity (server)'
08-09 14:35:44.722  2108  7451 W ActivityTaskManager: Force removing ActivityRecord{348517b u0 rust.example.test_example/android.app.NativeActivity t62}: app died, no saved state

0.2.0 releases

I yanked the 0.1.1 releases of ndk, ndk-sys, and ndk-glue in #52, but now there's nothing stopping us from cutting 0.2.0 releases! I opened this issue both as a memo to myself and to provide a chance for anyone to make a case for something being a blocking issue.

Blocked by:

  • CHANGELOG so people know what's in the release (added by #67!)
  • release tags #60

I don't consider #58 to be a blocking issue, since a new release would make it easier to test that, and the fix likely won't involve any breaking changes.

CARGO_TARGET_DIR not respected

I'm using a separate CARGO_TARGET_DIR for Android builds so tooling doesn't conflict, however cargo apk doesn't seem to respect that and tries to use default target directory:

warning: 53 warnings emitted

    Finished dev [unoptimized + debuginfo] target(s) in 57.33s
Error: Path "/path/to/my/project/target/aarch64-linux-android/debug/libengine.so" doesn't exist.

Document how to sign apk

Trying to port my library to Android and created a basic example. If I run:

$ cargo apk run --example hello_world_android

from the previously-linked repo, I get:

adb: failed to install C:\Users\Nolan\Projects\TTS-RS\target\debug\apk\examples\hello_wL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vmdl13446t length of null array]                                                                

I have ~/.android/debug.keystore and have built and installed Android apps locally before. Looks like it might be possible to configure the use of the debug keystore, but it isn't clear after a bit of digging how. I imagine I'd also want to sign non-example apps with my own key, so knowing how would be helpful.

Thanks!

Linking against C++ STL and using it at runtime

Native C++ code (in external dependencies) that utilize the STL have a hard time linking and running on-device. Dependencies usually set cpp_link_stdlib (if using the cc crate) to something sensible or leave it at the default stdc++ which only works for GNU but not Clang, requiring c++ instead. Only a single dependency needs to set it to c++ or c++_shared for the right library to be linked in and succeed the build. Leaving stdc++ in there is fine, this library is available on-device, providing only new and delete.
I assume the right course of action is to add an android case with c++ to the defaults in cc? (Or in the exceptional case, do that for all of clang? The documentation mentions this case yet does not account for it.)

As mentioned here libc++_shared is not available on Android devices - it needs to be bundled with the APK. Builds link against c++_static by default and have no runtime dependencies, but aforementioned native projects would force linking against c++.

A simple solution adds the path to libc++_shared.so from android_search_paths to artifacts in readelf.rs, if it is found in the needed libs (like this - forgive the awful code and duplication from a Rust novice). A more sophisticated implementation would provide the option to choose between none, static or runtime STL (including the file for the latter) and clean up linker flags to accommodate this choice.

Any suggestions going forward? I'm willing to take this onwards but am not sure how to proceed.

Git tagging when releases are made

Would you please consider making git tags when releases are made?
It would really help to see what the source was for a given release.

ndk-glue 0.1.1 violates semver

The ndk_glue! macro was removed in #37, which is a breaking change. The latest release only bumps the patch version, so this results in surprise downstream breakage.

pointer_id missing

According to the docs if I wanted identifiers that stay the same I should use pointer_id. pointer_id however doesn't seem to be a function. I did notice that there is pointer_id_for, but is just commented out? I was curious about the status of pointer_id and what the reason is that pointer_id_for is commented out.

I am trying to do some work that requires multitouch and pointer_index is not good enough for me because I need the id's to be the consistent, that is the reason I want to use pointer_id. Are there alternatives for doing multitouch with id's for fingers that are consistent?

image (1)

Cannot build example

I am new to the Rust world, and I just tried to build the example.

Following the commands in the README:

cd ndk-examples
cargo apk build

(cargo apk run has the same problem.)

Unfortunately it does not work:

% cargo apk build
Compiling proc-macro2 v1.0.18
Compiling unicode-xid v0.2.1
Compiling syn v1.0.33
Compiling serde v1.0.114
Compiling log v0.4.8
Compiling libc v0.2.72
Compiling cfg-if v0.1.10
Compiling ndk-sys v0.1.0 (/home/smore/projects/android-ndk-rs/ndk-sys)
Compiling jni-sys v0.3.0
Compiling lazy_static v1.4.0
Compiling android_log-sys v0.1.2
Compiling quote v1.0.7
Compiling toml v0.5.6
Compiling proc-macro-crate v0.1.4
Compiling thiserror-impl v1.0.20
Compiling derivative v2.1.1
Compiling num_enum_derive v0.4.3
Compiling ndk-macro v0.1.0 (/home/smore/projects/android-ndk-rs/ndk-macro)
Compiling thiserror v1.0.20
Compiling num_enum v0.4.3
Compiling ndk v0.1.0 (/home/smore/projects/android-ndk-rs/ndk)
Compiling ndk-glue v0.1.0 (/home/smore/projects/android-ndk-rs/ndk-glue)
Compiling ndk-examples v0.1.0 (/home/smore/projects/android-ndk-rs/ndk-examples)
Finished dev [unoptimized + debuginfo] target(s) in 14.35s

Error: Path "/home/smore/projects/android-ndk-rs/target/aarch64-linux-android/debug/libndk_examples.so" doesn't exist.
cargo apk build 54.83s user 2.89s system 396% cpu 14.554 total

Is there a step missing?

Thanks!


I am running cargo 1.44.1 (88ba85757 2020-06-11) on the latest Ubuntu.

aarch64-linux-android23-clang doesn't exist

Hello, I was trying to build the hello_world example and got stuck to following error:

$ cargo apk run --example hello_world
Error: Path "/usr/lib/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android23-clang" doesn't exist.

I've installed the android-sdk and android-ndk on my Linux Mint 20 using apt:

$ sudo apt install android-sdk google-android-ndk-installer

And have set ANDROID_SDK_ROOT and ANDROID_NDK_ROOT to:

export ANDROID_SDK_ROOT="/usr/lib/android-sdk"
export ANDROID_NDK_ROOT="/usr/lib/android-ndk"
export PATH="${PATH}:${ANDROID_SDK_ROOT}/tools/:${ANDROID_SDK_ROOT}/platform-tools/"

When listing the contend of the directory, it only shows a clang binary but not an aarch64-linux-android23-clang binary.

$ ll /usr/lib/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/
drwxr-xr-x 2 root root 4,0K Okt 12  2016 arm64-v8a
drwxr-xr-x 2 root root 4,0K Okt 12  2016 armeabi
drwxr-xr-x 2 root root 4,0K Okt 12  2016 armeabi-v7a
drwxr-xr-x 2 root root 4,0K Okt 12  2016 armeabi-v7a-hard
-rwxr-xr-x 1 root root  13K Okt 12  2016 asan_device_setup
-rwxr-xr-x 1 root root  39M Okt 12  2016 clang
-rwxr-xr-x 1 root root  39M Okt 12  2016 clang++
-rwxr-xr-x 1 root root  18M Okt 12  2016 clang-tidy
-rwxr-xr-x 1 root root 479K Okt 12  2016 FileCheck
-rwxr-xr-x 1 root root 3,0M Okt 12  2016 llvm-as
-rwxr-xr-x 1 root root 2,5M Okt 12  2016 llvm-dis
-rwxr-xr-x 1 root root 3,8M Okt 12  2016 llvm-link
drwxr-xr-x 2 root root 4,0K Okt 12  2016 mips
drwxr-xr-x 2 root root 4,0K Okt 12  2016 mips64
drwxr-xr-x 2 root root 4,0K Okt 12  2016 x86
drwxr-xr-x 2 root root 4,0K Okt 12  2016 x86_64

I was using the latest master branch of the example and cargo-apk.
What am I missing?

ndk-glue docs not building

I've noticed that no version of ndk-glue has its docs built correctly. Here's the extract from the log:

[INFO] [stderr]     Checking ndk-sys v0.2.0
[INFO] [stderr] error: android-ndk-sys only supports compiling for Android
[INFO] [stderr]   --> /opt/rustwide/cargo-home/registry/src/github.com-1ecc6299db9ec823/ndk-sys-0.2.0/src/lib.rs:18:1
[INFO] [stderr]    |
[INFO] [stderr] 18 | compile_error!("android-ndk-sys only supports compiling for Android");
[INFO] [stderr]    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stderr] 
[INFO] [stderr] error: aborting due to previous error

Looks like that ndk-glue (and everything that depends on ndk-sys, in fact) have to pass rustdoc feature explicitly to ndk-sys, otherwise it is not picked up despite being required in ndk-sys itself.

dlopen failed: cannot locate symbol "_ZTVN10__cxxabiv117__class_type_infoE"

Hi,

I am trying to build my lib for android, and cannot seem to solve this. Apparently cargo-apk already links the -lc++_static ...
i tried adding stdc++ as static_bundle in build.rs as well but it doesn' t change anything...

I cannot pinpoint the origin of the link, and the symbol doesn' t even exist in the .so when i decompile it with ghydra...
_ZTVN10__cxxabiv117__class_type_infoE is a phantom...

Has anyone come across this ?

Error: Android SDK has no build tools.

I try "cargo apk run", but result is error. Android sdk folder contains folder "build-tools" that contains folders "29.0.3" and "30.0.0-rc4". This issue is related to this.

Deprecated bitmap format warning

warning: use of deprecated unit variant `bitmap::BitmapFormat::RGBA_4444`: Deprecated in API level 13. Because of the poor quality of this configuration, it is advised to use ARGB_8888 instead.
  --> ndk/src/bitmap.rs:42:10
   |
42 |   pub enum BitmapFormat {
   |  __________^
43 | |     NONE = ffi::AndroidBitmapFormat_ANDROID_BITMAP_FORMAT_NONE,
44 | |     RGBA_8888 = ffi::AndroidBitmapFormat_ANDROID_BITMAP_FORMAT_RGBA_8888,
45 | |     RGB_565 = ffi::AndroidBitmapFormat_ANDROID_BITMAP_FORMAT_RGB_565,
46 | |     #[deprecated = "Deprecated in API level 13. Because of the poor quality of this configuration, it is advised to use ARGB_8888 instead."]
47 | |     RGBA_4444 = ffi::AndroidBitmapFormat_ANDROID_BITMAP_FORMAT_RGBA_4444,
   | |_____________^
   |
   = note: `#[warn(deprecated)]` on by default

Bug in the activity java instance getter

It seems there is no need reference operator because clazz field already is pointer:
https://github.com/rust-windowing/android-ndk-rs/blob/edde567f3d071db135ce5de35dcb156faa2eac07/android-ndk/src/native_activity.rs#L104-L106
So I mean this fragment should looks like:

jni::objects::JObject::from(self.ptr.as_ref().clazz as *const _ as jni::sys::jobject)

I already open issue here mb64/android-ndk-rs, but it seems the original project currently unmaintainable.

Enable immersive mode only available on main thread

I want to add the android immersive mode, meaning hiding the UI-Buttons of android.

I've written a simple jni function to hide the buttons. Running on app startup is working fine, but only until sending the app to background. The method should be called on every resume event, as the original view state is set to default.

But the ndk event seem to be handle on a different thread, leading to following error:

2020-08-05 16:23:29.535 6736-6758/rust.morph_it E/AndroidRuntime: FATAL EXCEPTION: Thread-2
Process: rust.morph_it, PID: 6736
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7313)
at android.view.ViewRootImpl.recomputeViewAttributes(ViewRootImpl.java:3462)
at android.view.View.setSystemUiVisibility(View.java:22634)

The immersive function is called via jni:

#[cfg(target_os = "android")]
fn enable_immersive() {
    let vm_ptr = ndk_glue::native_activity().vm();
    let vm = unsafe { jni::JavaVM::from_raw(vm_ptr) }.unwrap();
    let env = vm.attach_current_thread().unwrap();
    let activity = ndk_glue::native_activity().activity();
    let window = env.call_method(activity, "getWindow", "()Landroid/view/Window;", &[]).unwrap().l().unwrap();
    let view = env.call_method(window, "getDecorView", "()Landroid/view/View;", &[]).unwrap().l().unwrap();
    let view_class = env.find_class("android/view/View").unwrap();
    let flag_fullscreen = env.get_static_field(view_class, "SYSTEM_UI_FLAG_FULLSCREEN", "I").unwrap().i().unwrap();
    let flag_hide_navigation = env.get_static_field(view_class, "SYSTEM_UI_FLAG_HIDE_NAVIGATION", "I").unwrap().i().unwrap();
    let flag_immersive_sticky = env.get_static_field(view_class, "SYSTEM_UI_FLAG_IMMERSIVE_STICKY", "I").unwrap().i().unwrap();
    let flag = flag_fullscreen | flag_hide_navigation | flag_immersive_sticky;
    env.call_method(view, "setSystemUiVisibility", "(I)V", &[jni::objects::JValue::Int(flag)]).unwrap();
}

Is there any way to call this function on every resume event on the main thread?

Giving up jni crate in favor to jni-sys

Since currently different alternatives to jni crate can be used for interfacing with java runtime I propose avoid jni wrappers in favor low level jni-sys types.

cargo-apk can't compile dependency (freetype-sys) using cmake

I'm trying to update an application from using the old version of cargo-apk (in the android-rs-glue repo) to this version, and unfortunately the build always fails when compiling the freetype-sys dependency.

[freetype-sys 0.13.1] thread 'main' panicked at '
[freetype-sys 0.13.1] command did not execute successfully, got: exit code: 1
[freetype-sys 0.13.1] 
[freetype-sys 0.13.1] build script failed, must exit now', /home/jamie/.cargo/registry/src/github.com-1ecc6299db9ec823/cmake-0.1.42/src/lib.rs:861:5
[freetype-sys 0.13.1] note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: failed to run custom build command for `freetype-sys v0.13.1`

Caused by:
  process didn't exit successfully: `/home/jamie/src/gecko/gfx/wr/target/debug/build/freetype-sys-9a3e61826b2930fb/build-script-build` (exit code: 101)
  --- stdout
  running: "cmake" "/home/jamie/.cargo/registry/src/github.com-1ecc6299db9ec823/freetype-sys-0.13.1/freetype2" "-DWITH_BZip2=OFF" "-DWITH_HarfBuzz=OFF" "-DWITH_PNG=OFF" "-DWITH_ZLIB=OFF" "-DCMAKE_INSTALL_PREFIX=/home/jamie/src/gecko/gfx/wr/target/armv7-linux-androideabi/debug/build/freetype-sys-b09c9f45f34f888d/out" "-DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC --target=armv7-linux-androideabi" "-DCMAKE_C_COMPILER=/home/jamie/Android/Sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi18-clang" "-DCMAKE_CXX_FLAGS= -ffunction-sections -fdata-sections -fPIC --target=armv7-linux-androideabi" "-DCMAKE_CXX_COMPILER=/home/jamie/Android/Sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi18-clang++" "-DCMAKE_BUILD_TYPE=Release"
  -- The C compiler identification is Clang 9.0.8
  -- The CXX compiler identification is Clang 9.0.8
  -- Detecting C compiler ABI info
  -- Detecting C compiler ABI info - failed
  -- Check for working C compiler: /home/jamie/Android/Sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi18-clang
  -- Check for working C compiler: /home/jamie/Android/Sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi18-clang - broken
  -- Configuring incomplete, errors occurred!
  See also "/home/jamie/src/gecko/gfx/wr/target/armv7-linux-androideabi/debug/build/freetype-sys-b09c9f45f34f888d/out/build/CMakeFiles/CMakeOutput.log".
  See also "/home/jamie/src/gecko/gfx/wr/target/armv7-linux-androideabi/debug/build/freetype-sys-b09c9f45f34f888d/out/build/CMakeFiles/CMakeError.log".

  --- stderr
  CMake Error at /usr/share/cmake/Modules/CMakeTestCCompiler.cmake:66 (message):
    The C compiler

      "/home/jamie/Android/Sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi18-clang"

    is not able to compile a simple test program.

    It fails with the following output:

      Change Dir: /home/jamie/src/gecko/gfx/wr/target/armv7-linux-androideabi/debug/build/freetype-sys-b09c9f45f34f888d/out/build/CMakeFiles/CMakeTmp
      
      Run Build Command(s):/usr/bin/gmake cmTC_3f8c8/fast && /usr/bin/gmake  -f CMakeFiles/cmTC_3f8c8.dir/build.make CMakeFiles/cmTC_3f8c8.dir/build
      gmake[1]: Entering directory '/home/jamie/src/gecko/gfx/wr/target/armv7-linux-androideabi/debug/build/freetype-sys-b09c9f45f34f888d/out/build/CMakeFiles/CMakeTmp'
      Building C object CMakeFiles/cmTC_3f8c8.dir/testCCompiler.c.o
      /home/jamie/Android/Sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi18-clang   -ffunction-sections -fdata-sections -fPIC --target=armv7-linux-androideabi  -o CMakeFiles/cmTC_3f8c8.dir/testCCompiler.c.o -c /home/jamie/src/gecko/gfx/wr/target/armv7-linux-androideabi/debug/build/freetype-sys-b09c9f45f34f888d/out/build/CMakeFiles/CMakeTmp/testCCompiler.c
      Linking C executable cmTC_3f8c8
      /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_3f8c8.dir/link.txt --verbose=1
      /home/jamie/Android/Sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi18-clang  -ffunction-sections -fdata-sections -fPIC --target=armv7-linux-androideabi  -rdynamic CMakeFiles/cmTC_3f8c8.dir/testCCompiler.c.o -o cmTC_3f8c8 
      /home/jamie/Android/Sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or directory
      /home/jamie/Android/Sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtend_android.o: No such file or directory
      clang: error: linker command failed with exit code 1 (use -v to see invocation)
      gmake[1]: *** [CMakeFiles/cmTC_3f8c8.dir/build.make:106: cmTC_3f8c8] Error 1
      gmake[1]: Leaving directory '/home/jamie/src/gecko/gfx/wr/target/armv7-linux-androideabi/debug/build/freetype-sys-b09c9f45f34f888d/out/build/CMakeFiles/CMakeTmp'
      gmake: *** [Makefile:140: cmTC_3f8c8/fast] Error 2
      

    CMake will not be able to correctly generate this project.
  Call Stack (most recent call first):
    CMakeLists.txt:119 (project)


  thread 'main' panicked at '
  command did not execute successfully, got: exit code: 1

With a bit of digging, I can see that the old version of cargo-apk generated a cmake toolchain file. If I copy that file somewhere and set the env variable CMAKE_TOOLCHAIN_FILE to point to it, then I can get past this error.

Is this something that the new cargo-apk should handle too? Or should it be handled elsewhere?

cannot locate symbol "AConfiguration_getScreenRound"

Hello,

I am having a bit of trouble linking your ffi bindings with my own, and was hoping to get some feedback on where I can start working on the problem. Everything works as expected until I do this: let app = unsafe { AndroidApp::from_ptr(state) };, which throws the following runtime exception.

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "AConfiguration_getScreenRound" 

It could be related to this issue, which was fixed in NDK r22, which isn't out yet. I am on r21, while your bindings were generated with r20. Do you have plans to update your bindings for the new LTS release, or should I just target r20 in my own ffi bindings? This may possibly be completly unrelated. I'm kinda stabbing in the dark here.

Cheers, and thank you for your time!

Question: how to set android:launchMode with cargo apk

Not sure if I'm just completely missing something but I can't seem to figure out how to set the android:launchMode from my cargo.toml using cargo apk.

[package.metadata.android]
launch_mode = "singleTask" 

or

[[package.metadata.android.activity_metadatas]]
name = "launchMode"
value = "singleTask"

don't seem to work.

Tried a bunch of different ways but can't get it to work. Is it even supported or, like I said, am I missing something. :)

Adding support for more NDK libraries

I'm wondering what the best approach is to adding support to more Android NDK libraries.
Currently ndk-sys only links to 'libandroid', which is the only lib needed for basic windowing support.
Some other libraries that could be useful:

  • libaaudio: can be used to add support to cpal for example to add android support to Rust game engines.
  • libjnigraphics: writing into Android bitmaps can be useful for image processing libraries.
  • libcamera2ndk: Android camera support would be very nice to have in the Rust ecosystem.
  • libmediandk: needed for reading images from camera, media codecs could be useful too.

Could these be included in this repo, perhaps as different crates to still have the modularity? It would lead to this repo being something more in the line of winapi, and less just for native activity glue support.
The other option is maintaining these other libraries separately as an 'ndk-libs' library or individually as needed. This might lead to a very fragmented approach towards configuring API level (see below) and documentation.
What is your take on this @dvc94ch?

Other questions arise such as how to deal with Android API levels? This is needed because native API's only become available at certain android versions.
Cargo features map pretty well to this IMO. It would be nice that all these libs would use the same system for that.

Some ideal usage of these libs would look like this:

ndk = { version = "0.1.0", features = ["api-27", "camera", "media"] }

or

ndk = { version = "0.1.0", features = ["api-27"] }
ndk-camera = { version = "0.1.0", features = ["api-27"] }
ndk-media = { version = "0.1.0", features = ["api-27"] }

Maybe cargo-apk can also check these levels to match 'min_sdk_version' for example.

cargo-apk does not search shared libraries in all known paths

I think cargo-apk should also search shared libraries in paths which known by compiler, i.e. which was listed using "-L" command-line argument.

In my original PR for previous generation of this tool I added function libs_search_path_from_args for that:
https://github.com/rust-windowing/android-rs-glue/pull/260/files#diff-85629c31011b4a1ea5f77781f277ab4bR336
https://github.com/rust-windowing/android-rs-glue/pull/260/files#diff-85629c31011b4a1ea5f77781f277ab4bR461-R478

Currently as I see only "deps" directory is listed for search libs:
https://github.com/rust-windowing/android-ndk-rs/blob/bb11c390893c965f5b765675f87a101a03cb013a/cargo-apk/src/apk.rs#L92

This needs to avoid problems with third shared libraries needed for bindings and so (for ex. katyo/oboe-rs#5).

ndk_glue::main assumes ndk-glue is in Cargo.toml

My use case involves exporting ndk-glue from another crate, so proc-macro-crate being used to get the crate name makes this macro unusable for me.

It would be nice to have an option to manually specify the crate name, though honestly I'd be content just to have the ndk_glue! macro still be available as an alternative...

ndk-glue intended way of receiving events

what's the intended way to rcv android events in ndk-glue? it seems that poll_events() is a blocking call.

as a workaround i set the pipe to nonblocking which seems to work but im unsure whether that's gonna cause issues
libc::pipe(pipe.as_mut_ptr())
to
libc::pipe2(pipe.as_mut_ptr(), libc::O_NONBLOCK)

am i missing something?

Possible to work with cargo binaries?

Is it possible for ndk_glue::main to operate on binary targets? At the moment I'm having to make fake library targets for each of my binaries and example binaries, in order to get ndk_glue::main to generate the appropriate shim.

Build failure on macOS

Hello

Running cargo install cargo-apk on macOS Catalina 10.15.4 x86_64 and window 10 x86_64 (using the msvc toolchain), both of which using rustc stable 1.41, fails with several errors (from a macOS):
error.txt

Most errors involve:
^ *const i8 cannot be shared between threads safely

Is there a minimum Rust version or are there any platform restrictions?

Thank you

undefined symbol: ANativeActivity_onCreate

Can someone help me, i'm trying to make my project run on android for several days now. Trying this and that, but i don't get it working.
I'm able to build my apk for 3 android targets, but when trying to run the apk on my emulator (x86), i always get following error in logcat:

java.lang.UnsatisfiedLinkError: Unable to load native library "/data/app/rust.morph_it-yGX1RVocUqIQEKTw8rXDQw==/lib/x86/libmorph_it.so": undefined symbol: ANativeActivity_onCreate

My cargo.toml contains these dependencies:

ndk = "0.1.0"
ndk-glue = "0.1.0"

and my lib.rs has following functions:

#[cfg(target_os = "android")]
ndk_glue::ndk_glue!(main);

use ndk_glue::Event;

pub fn main() {
    if let Some(event) = ndk_glue::poll_events() {
        match event {
            Event::Start => {
                println!("started");
            },
            _ => {
                println!("other");
            }
        }
    }
}

Am i missing anything? Do i use a wrong android version? Do i have to add some other libs?
Thanks for your help!

mess with ANDROID_SDK_ROOT ANDROID_SDK_HOME ANDROID_HOME

"cargo apk run" checks ANDROID_HOME or ANDROID_SDK_HOME for sdk location, but according this clever answer :
ANDROID_SDK_HOME - Location of SDK related data/user files. Example: C:\Users<USERNAME>.android\ or ~/.android/. It is not a place for SDK
I am not able to find proof in official google site, but my experience say that is correct.

ANDROID_HOME - is deprecated. ANDROID_SDK_ROOT should be used instead. Google explains an algorithm of managing

  • If ANDROID_HOME is defined and contains a valid SDK installation, its value is used instead of the value in ANDROID_SDK_ROOT.
  • If ANDROID_HOME is not defined, the value in ANDROID_SDK_ROOT is used.
  • If ANDROID_HOME is defined but does not exist or does not contain a valid SDK installation, the value in ANDROID_SDK_ROOT is used instead.

"...\\aarch64-linux-android-ar.cmd doesn't exists" when running "cargo apk run"

Just wanted to check out the example with:

$ cargo apk run
Error: Path "C:\\Users\\Julian\\AppData\\Local\\Android\\Sdk\\ndk\\21.0.6113669\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\aarch64-linux-android-ar.cmd" doesn't exist.

Checking that directory "aarch64-linux-android-ar.cmd" infact doesn't exist (but aarch64-linux-android-ar.exe does).

Any ideas?

Error: Android SDK has no platforms installed.

'cargo apt run' produces error. Please see the issue.

My related to android environmental variables:

# Deprecated (in Android Studio), use ANDROID_SDK_ROOT instead. 
export ANDROID_HOME="$HOME/bin/android-sdk"

# Installation directory of Android SDK package. Example: C:\AndroidSDK or ~/android-sdk/
export ANDROID_SDK_ROOT="$HOME/bin/android-sdk"

# Installation directory of Android NDK package. Example: C:\AndroidNDK or ~/android-ndk/
export ANDROID_NDK_ROOT="$HOME/bin/android-sdk/ndk"

# just because "cargo apk run" require
export NDK_HOME="$HOME/bin/android-sdk/ndk"

[cargo-apk] Support globs (wildcards) in workspace member paths

Hi, normally try and give a better title on my issues but I'm a little at a loss as to why this is breaking so feel free to change the title.

I'm messing around with adding an example to bevy and am getting an odd stack trace that I find pretty unhelpful.

Repro steps:

$ git clone https://github.com/bevyengine/bevy
$ git checkout 028a22b12936797d3a7ca1ad5d715a98bdf27907 # for my exact commit
$ cargo install cargo-apk --git https://github.com/rust-windowing/android-ndk-rs # I'm at c7284925a318baf5b7c9ed19add7271a2bad41ab which is current master
$ cd bevy
$ RUST_BACKTRACE=full cargo apk --help

And I get:

simlay@tower-1:~/projects/bevy ((HEAD detached at 028a22b1))$ RUST_BACKTRACE=full cargo apk --help
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Io(Os { code: 2, kind: NotFound, message: "No such file or directory" })', /home/simlay/.cargo/registry/src/github.com-1ecc6299db9ec823/cargo-subcommand-0.4.5/src/subcommand.rs:89:60
stack backtrace:
   0:     0x55e81ab8db85 - backtrace::backtrace::libunwind::trace::h14d338b30b3ea0a7
                               at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/libunwind.rs:86
   1:     0x55e81ab8db85 - backtrace::backtrace::trace_unsynchronized::h73ea91d74a3fd67f
                               at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/mod.rs:66
   2:     0x55e81ab8db85 - std::sys_common::backtrace::_print_fmt::hd42948c952866e12
                               at src/libstd/sys_common/backtrace.rs:78
   3:     0x55e81ab8db85 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::ha8f928866ff7571e
                               at src/libstd/sys_common/backtrace.rs:59
   4:     0x55e81abb7b2c - core::fmt::write::he0c1e5f7426d2718
                               at src/libcore/fmt/mod.rs:1076
   5:     0x55e81ab89fb2 - std::io::Write::write_fmt::hf3afc6cfd57d0033
                               at src/libstd/io/mod.rs:1537
   6:     0x55e81ab900a0 - std::sys_common::backtrace::_print::hfc0110703f3696fd
                               at src/libstd/sys_common/backtrace.rs:62
   7:     0x55e81ab900a0 - std::sys_common::backtrace::print::h3f77c6990ddfaa22
                               at src/libstd/sys_common/backtrace.rs:49
   8:     0x55e81ab900a0 - std::panicking::default_hook::{{closure}}::heae49580a8d62d75
                               at src/libstd/panicking.rs:198
   9:     0x55e81ab8fdec - std::panicking::default_hook::hecc34e3f729e213c
                               at src/libstd/panicking.rs:217
  10:     0x55e81ab906e3 - std::panicking::rust_panic_with_hook::he82f5d0644692441
                               at src/libstd/panicking.rs:526
  11:     0x55e81ab902db - rust_begin_unwind
                               at src/libstd/panicking.rs:437
  12:     0x55e81abb64c1 - core::panicking::panic_fmt::h09c929f06bb87c98
                               at src/libcore/panicking.rs:85
  13:     0x55e81abb62e3 - core::option::expect_none_failed::h188f17af6c9f404b
                               at src/libcore/option.rs:1269
  14:     0x55e81aa839d8 - cargo_subcommand::subcommand::Subcommand::new::h04a93f6f7aa5ee89
  15:     0x55e81aa857bd - cargo_apk::main::h63589c3a63722054
  16:     0x55e81aa849e7 - std::rt::lang_start::{{closure}}::h6254fd9aa7a68139
  17:     0x55e81ab90ab3 - std::rt::lang_start_internal::{{closure}}::h5d3ea623498f5f43
                               at src/libstd/rt.rs:52
  18:     0x55e81ab90ab3 - std::panicking::try::do_call::hac65e71be769a440
                               at src/libstd/panicking.rs:348
  19:     0x55e81ab90ab3 - std::panicking::try::hd4706e264bcf6712
                               at src/libstd/panicking.rs:325
  20:     0x55e81ab90ab3 - std::panic::catch_unwind::h948a0fb4a8b3ee82
                               at src/libstd/panic.rs:394
  21:     0x55e81ab90ab3 - std::rt::lang_start_internal::h72cc068ed2d0ac53
                               at src/libstd/rt.rs:51
  22:     0x55e81aa861d2 - main
  23:     0x7f808ee71152 - __libc_start_main
  24:     0x55e81aa8118e - _start
  25:                0x0 - <unknown>
simlay@tower-1:~/projects/bevy ((HEAD detached at 028a22b1))

I'm guessing there's some edge case with the bevy workspace that breaks cargo-apk but I'd like to bring up how this could be a more helpful error and we should improve it.

Please post a new release

We've been running into a bunch of issue here last night when collaborating with somebody, that we've submitted fixes for (and that got merged into master - #33, #32, #32, #30, #20, #18). It would be really helpful for our workflows to get a new default cargo apk when installing it.

cargo-apk add custom library link path

Hi

Thank you for providing such toolkit to reduce complexity of deploying rust.

However, my project is using GSL a third party library libgsl. The Cargo.toml as follows

...

[dependencies.GSL]
version = "2"
features = ["v2_1"]


[lib]
crate-type = [ "lib" , "dylib"]
  • Once i build the cargo apk using cargo apk build The folloing linkers is not able to find the librays.
  = note: /home/rock/Android/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: cannot find -lgsl
          /home/rock/Android/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: cannot find -lgslcblas
          clang: error: linker command failed with exit code 1 (use -v to see invocation)
        

And the command that run is

toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-Wl,--allow-multiple-definition" "-L" "/home/rock/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-linux-android/lib" "/home/rock/keyboard-analysis/keyboard-analyzer/target/aarch64-linux-android/debug/deps/gsl_sys-80e2bcf39b578234.gsl_sys.1wacbk14-cgu.0.rcgu.o" "/home/rock/keyboard-analysis/keyboard-analyzer/target/aarch64-linux-android/debug/deps/gsl_sys-80e2bcf39b578234.gsl_sys.1wacbk14-cgu.1.rcgu.o" "/home/rock/keyboard-analysis/keyboard-analyzer/target/aarch64-linux-android/debug/deps/gsl_sys-80e2bcf39b578234.gsl_sys.1wacbk14-cgu.2.rcgu.o" "/home/rock/keyboard-analysis/keyboard-analyzer/target/aarch64-linux-android/debug/deps/gsl_sys-80e2bcf39b578234.gsl_sys.1wacbk14-cgu.3.rcgu.o" "/home/rock/keyboard-analysis/keyboard-analyzer/target/aarch64-linux-android/debug/deps/gsl_sys-80e2bcf39b578234.gsl_sys.1wacbk14-cgu.4.rcgu.o" "/home/rock/keyboard-analysis/keyboard-analyzer/target/aarch64-linux-android/debug/deps/gsl_sys-80e2bcf39b578234.gsl_sys.1wacbk14-cgu.5.rcgu.o" "/home/rock/keyboard-analysis/keyboard-analyzer/target/aarch64-linux-android/debug/deps/gsl_sys-80e2bcf39b578234.gsl_sys.1wacbk14-cgu.6.rcgu.o" "/home/rock/keyboard-analysis/keyboard-analyzer/target/aarch64-linux-android/debug/deps/gsl_sys-80e2bcf39b578234.gsl_sys.1wacbk14-cgu.7.rcgu.o" "/home/rock/keyboard-analysis/keyboard-analyzer/target/aarch64-linux-android/debug/deps/gsl_sys-80e2bcf39b578234.gsl_sys.1wacbk14-cgu.8.rcgu.o" "-o" "/home/rock/keyboard-analysis/keyboard-analyzer/target/aarch64-linux-android/debug/deps/libgsl_sys-80e2bcf39b578234.so" "-Wl,--version-script=/tmp/rustctUN89m/list" "/home/rock/keyboard-analysis/keyboard-analyzer/target/aarch64-linux-android/debug/deps/gsl_sys-80e2bcf39b578234.1jg09cvoun765cqe.rcgu.o" "-shared" "-Wl,-zrelro" "-Wl,-znow" "-nodefaultlibs" "-L" "/home/rock/keyboard-analysis/keyboard-analyzer/target/aarch64-linux-android/debug/deps" "-L" "/home/rock/keyboard-analysis/keyboard-analyzer/target/debug/deps" "-L" "/home/rock/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-linux-android/lib" "-lgsl" "-lgslcblas" "-Wl,-Bstatic" "-Wl,--whole-archive" "/tmp/rustctUN89m/liblibc-d7808b37ff72060c.rlib" "-Wl,--no-whole-archive" "-Wl,--start-group" "-L" "/home/rock/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-linux-android/lib" "-Wl,-Bdynamic" "-lstd-e5a21565c7cd7f76" "-Wl,--end-group" "-Wl,-Bstatic" "/tmp/rustctUN89m/libcompiler_builtins-b19ab59e39bdb5a5.rlib" "-Wl,-Bdynamic" "-ldl" "-llog" "-lgcc" "-lc" "-lm"
  • Couple solution might be possible
    1. Add custom configuration for linking search path
    2. Maybe add a prebuilt library location?

Sometimes running apps panicked on the Android Emulator

Sometimes running apps panicked on the Android Emulator with following error:

01-20 22:05:38.816  3402  3421 I RustStdoutStderr: thread '<unnamed>' panicked at 'called `Option::unwrap()` on a `None` value', /Users/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/ndk-glue-0.2.1/src/lib.rs:255:34
01-20 22:05:38.816  3402  3421 I RustStdoutStderr: stack backtrace:
01-20 22:05:38.816  3402  3421 I RustStdoutStderr:    0:     0x7b6194f50110 - <unknown>

This error is constantly repeated in CI: https://github.com/gfx-rs/gfx/runs/1738010575?check_suite_focus=true

Sometimes I saw this error on my dev machine (MacOS host), but restart the Android Emulator fixed it. And I never saw this error on a real device.

Error: No such file or directory (os error 2)

I'm trying to build hello_world with

cargo apk build --example hello_world

After compilation is finished, an error message "No such file or diretory (os error 2)" is displayed.

   ...
   Compiling ndk-glue v0.2.1 (/home/ccwu/Projects/android-ndk-rs/ndk-glue)
   Compiling ndk-examples v0.1.0 (/home/ccwu/Projects/android-ndk-rs/ndk-examples)
    Finished dev [unoptimized + debuginfo] target(s) in 34.32s
Error: No such file or directory (os error 2)

Unresolved import error "ndk::bitmap"

I'm a rust noob so I apologize for my naïveté. I'm trying to use this library from another rust library with no main method (not sure if this matters). I added a dependency to ndk = "0.2.1" and imported it with use ndk::bitmap::{AndroidBitmap, AndroidBitmapInfo};.
When I attempt to compile I get the following:

error[E0432]: unresolved import `ndk::bitmap`
 --> src/lib.rs:6:10
  |
6 | use ndk::bitmap::{AndroidBitmap, AndroidBitmapInfo};
  |          ^^^^^^ could not find `bitmap` in `ndk`

I'm also using the following:

use jni::JNIEnv;
use jni::objects::{JClass, JObject, JString};
use skia_safe::{Borrows, Canvas, ColorSpace, ImageInfo, ISize, Rect, Surface};

Is this likely an issue with the crate or is it user error? Any help would be appreciated. Thanks.

NDKCamera Support

Hello,

I apologize for using the Issues feature for general discussion, but I needed to add support for NDKCamera, and was wondering if you would be interested in a pull request. I am still learning Rust, so my PR would probably need some review and don't want to waste your time with extra work if it is unneeded or unwanted.

My plan was to add the following to wrapper.h:

#include <camera/NdkCameraManager.h>
#include <camera/NdkCameraError.h>
#include <camera/NdkCameraDevice.h>
#include <camera/NdkCameraMetadataTags.h>

Then create a ndk_camera.rs module to wrap those classes.

Would this be the correct course of action for adding NDKCamera support to my native activity, and if successful, is this something you would like me to submit a PR for?

Cheers, and thank you for your time!

~Aaron

Android Crash: Reason: Input dispatching timed out

Trying to run a simplest hello world program crashes on android with:

Reason: Input dispatching timed out (Waiting to send key event because the focused window has not finished processing all of the input events that were previously delivered to it. Outbound queue length: 0. Wait queue length: 2.)

My toml:

[package]
name = "hello-world"
version = "0.1.0"
authors = ["XXXXX <[email protected]>"]
edition = "2018"

[lib]
path = "src/lib.rs"
crate-type = ["cdylib"]

[target.'cfg(target_os = "android")'.dependencies]
ndk-glue = { git = "https://github.com/rust-windowing/android-ndk-rs" }

[package.metadata.android]
package_name = "hello-world"
build_targets = [ "armv7-linux-androideabi", "aarch64-linux-android", "i686-linux-android", "x86_64-linux-android"]

and my lib.rs:

#[cfg(target_os = "android")]
#[cfg_attr(target_os = "android", ndk_glue::main(backtrace))]
pub fn main() {
    println!("Hello world");
}

It seems that some input event queue is not handled correctly.

Version:
rustc 1.44.1
android build tools: 29.0.3

ndk release

Could we also get a new release for ndk and ndk-sys? I would be interested in aaudio support

Cargo-apk allows run apk only from the workspace root

Currently, cargo-apk allows run apk only from workspace root. It would be awesome if cargo-apk can run apk from example project.

Test example:
https://github.com/Gordon-F/gfx/tree/bf7bdc12f93485616f6dd06dd574c2e7afe99e16

cd gfx/
cargo apk run --package quad_android --target x86_64-linux-android --features gl                                                                               
error: --features is not allowed in the root of a virtual workspace
cd gfx/examples/quad_android
cargo apk run --package quad_android --target x86_64-linux-android --features gl                                                                               
   Compiling quad_android v0.1.0 (/Users/indish/Dev/RustProjects/gfx/examples/quad_android)
    Finished dev [unoptimized + debuginfo] target(s) in 1m 18s
Error: No such file or directory (os error 2)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.