-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
使用场景 #1
Comments
是的 |
那为什么不直接用原生写高效点,通过JNI频繁交互会有一定的开销吧? |
这个是提供了一个与安卓java api等效的一种实现方式。因为一些功能需要从java层来调用安卓的api才能实现。例如照相机、传感器这些。同时也给java程序员提供一个方便,让他们从java转入rust更得心应手。 |
你好。我正在完善这个 USB 串口库:https://github.com/wuwbobo2021/android-usbser-rs,想为 USB 设备权限请求实现同步 API 和热插拔消息处理(kevinmehall/nusb#86),需要注册 |
理论上是可以的,不过我需要去进一步确认。您可以单独开个issue来讨论。 |
粗看了一下 |
我发现自己的 Android 旧版本支持 https://github.com/wuwbobo2021/android-rust-java-test 似乎有点毛病:没有使用 |
可以翻译成英文版本,你是国内用户还是?这个库暂时没有和任何项目关联,对于sdk庞大的问题,所以我单独提供了droid-wrap-derive和droid-wrap-utils这两个库来解决,您完全可以把他引入到自己的项目中,主仓库只是提供了常见的api。其实本来打算使用类似的bindgen来自动从java源文件来解析api的,但是还没找到一个好用的java语法解析器。如果你需要翻译文档注释,你也可以提PR。 |
get_dir是安全的,他的访问权限是APP私有的,即使APP被移动到外部存储介质。对于你第二个问题我没有理解你的意思,你可以使用英语表达一下吗? |
英文说明就在这里。简单来说,对于 Android 8.0 / 9.0,构建
|
请问该项目的目标之一“内存自动管理”是通过 这里说一说自己在
PS: |
其实这两个问题都不是 Android 下才有的。请在 PC 下运行以下测试程序:
use jni::{
errors::Error,
objects::{GlobalRef, JClass, JObject, JObjectArray, JValueGen, ReleaseMode},
sys::{jboolean, jbyte, jchar, jdouble, jfloat, jint, jlong, jshort, jsize},
AttachGuard, JNIEnv, JavaVM, NativeMethod,
};
fn main() {
let args = jni::InitArgsBuilder::new()
.version(jni::JNIVersion::V8)
.build()
.unwrap();
let vm = JavaVM::new(args).unwrap();
let mut env = vm.attach_current_thread().unwrap();
loop {
let java_bool = wrapper_bool_value(false, &mut env);
drop(java_bool);
}
}
pub fn wrapper_bool_value(value: bool, env: &mut JNIEnv) -> GlobalRef {
let obj = env
.new_object("java/lang/Boolean", "(Z)V", &[(value as jboolean).into()])
.unwrap();
env.new_global_ref(&obj).unwrap()
} 查看 测试第二个问题: fn main() {
let args = jni::InitArgsBuilder::new()
.version(jni::JNIVersion::V8)
.build()
.unwrap();
let vm = JavaVM::new(args).unwrap();
let mut env = vm.attach_current_thread().unwrap();
println!("{:?}", java_parse_int(&mut env, "3"));
println!("{:?}", java_parse_int(&mut env, "s"));
println!("{:?}", java_parse_int(&mut env, "5"));
}
fn java_parse_int(env: &mut JNIEnv, s: &str) -> Result<i32, Error> {
let java_string = env.new_string(s).unwrap();
env.call_static_method(
"java/lang/Integer",
"parseInt",
"(Ljava/lang/String;)I",
&[(&java_string).into()]
)
.map_err(|e| { env.exception_clear().unwrap(); e })
.and_then(|o| o.i())
} 输出:
注释
|
刚刚调试了一下,弄清楚了第一个问题:loop 循环中每次都重新获取 |
这个先记录一下,会进行修复。 |
|
暂时先关闭这个thread,如果有什么问题可以重新开个issue。 |
见鬼,我又搞错了,在 Android 6.0 测试机上得到的结果不一样。实在没有永久绑定线程,但还是崩溃了。
#[no_mangle]
fn android_main(_: android_activity::AndroidApp) {
let mut i: i32 = 0;
loop {
let _ = with_jni_env_ctx(|env, _| {
let _ = env.new_string(format!("test {}", i)).unwrap();
Ok(())
});
i = i.wrapping_add(1);
if i == 1000_000 {
println!("Success!");
}
}
}
use jni::errors::Error;
fn with_jni_env_ctx<R>(
f: impl FnOnce(&mut jni::JNIEnv, &jni::objects::JObject<'static>) -> Result<R, Error>,
) -> Result<R, Error> {
let ctx = ndk_context::android_context();
let jvm = unsafe { jni::JavaVM::from_raw(ctx.vm().cast()) }?;
let context = unsafe { jni::objects::JObject::from_raw(ctx.context().cast()) };
let mut env = jvm.attach_current_thread()?;
f(&mut env, &context)
} 调试信息:
修改代码:
调试信息:
|
这个库提供给Ruster写android应用吗
The text was updated successfully, but these errors were encountered: