【问题标题】:is "iwconfig" command need root android device?“iwconfig”命令是否需要 root android 设备?
【发布时间】:2013-03-02 21:26:17
【问题描述】:

我需要在我的 android 设备上创建 iwconfig 命令,所以我编写了 c++ 代码并通过 ndk 加入它以获得本机方法,这是我的方法:

jstring Java_com_example_ndk1_MainActivity_exec(JNIEnv* env, jobject javaThis , jstring cmd) {
const char * res;

jboolean isCopy;
res = env->GetStringUTFChars(cmd, &isCopy);

if (isCopy == JNI_TRUE) {
    (env)->ReleaseStringUTFChars(cmd, res);
}

std::string result = exec(res);
return (env)->NewStringUTF((const char* )result.c_str());
}

但是当我调用这个方法并传递“iwconfig”之后,应用程序停止并导致异常:

03-03 00:07:15.674: E/AndroidRuntime(11872): FATAL EXCEPTION: main
03-03 00:07:15.674: E/AndroidRuntime(11872): java.lang.IllegalStateException: Could not     execute method of the activity
03-03 00:07:15.674: E/AndroidRuntime(11872):    at   android.view.View$1.onClick(View.java:3660)
03-03 00:07:15.674: E/AndroidRuntime(11872):    at   android.view.View.performClick(View.java:4162)
03-03 00:07:15.674: E/AndroidRuntime(11872):    at   android.view.View$PerformClick.run(View.java:17082)
03-03 00:07:15.674: E/AndroidRuntime(11872):    at android.os.Handler.handleCallback(Handler.java:615)
03-03 00:07:15.674: E/AndroidRuntime(11872):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-03 00:07:15.674: E/AndroidRuntime(11872):    at android.os.Looper.loop(Looper.java:137)
03-03 00:07:15.674: E/AndroidRuntime(11872):    at android.app.ActivityThread.main(ActivityThread.java:4856)
03-03 00:07:15.674: E/AndroidRuntime(11872):    at java.lang.reflect.Method.invokeNative(Native Method)
03-03 00:07:15.674: E/AndroidRuntime(11872):    at java.lang.reflect.Method.invoke(Method.java:511)
03-03 00:07:15.674: E/AndroidRuntime(11872):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
03-03 00:07:15.674: E/AndroidRuntime(11872):    at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
03-03 00:07:15.674: E/AndroidRuntime(11872):    at dalvik.system.NativeStart.main(Native Method)
03-03 00:07:15.674: E/AndroidRuntime(11872): Caused by: java.lang.reflect.InvocationTargetException
 03-03 00:07:15.674: E/AndroidRuntime(11872):   at java.lang.reflect.Method.invokeNative(Native Method)
 03-03 00:07:15.674: E/AndroidRuntime(11872):   at java.lang.reflect.Method.invoke(Method.java:511)
  03-03 00:07:15.674: E/AndroidRuntime(11872):  at android.view.View$1.onClick(View.java:3655)
03-03 00:07:15.674: E/AndroidRuntime(11872):    ... 11 more
03-03 00:07:15.674: E/AndroidRuntime(11872): Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.example.ndk1.MainActivity.exec:(Ljava/lang/String;)Ljava/lang/String;
 03-03 00:07:15.674: E/AndroidRuntime(11872):   at com.example.ndk1.MainActivity.exec(Native Method)
 03-03 00:07:15.674: E/AndroidRuntime(11872):   at  com.example.ndk1.MainActivity.command(MainActivity.java:34)
 03-03 00:07:15.674: E/AndroidRuntime(11872):   ... 14 more

【问题讨论】:

  • 您期待exec() 回来吗? (一般不会)
  • 是的,它返回字符串值
  • iwconfig 旧,请使用iw - 它是 Android 用户空间的一部分。

标签: android linux android-ndk java-native-interface root


【解决方案1】:

您看到的错误是“UnsatisfiedLinkError” - 这意味着您使用 JNI 做错了。

你编译你的原生库了吗?你能在 lib\armeabi\ 中看到它吗? 您是否使用“System.loadLibrary”在 java 代码中加载了本机库?

当然,除此之外,您还假设 iwconfig 实际上是 Android linux 中的有效二进制/命令,我担心在大多数情况下 iwconfig 不存在。

关于权限,我认为如果您要在界面列表中窥视,那么您将拥有足够的权限。但是,如果您尝试更改某些内容,它不会给您没有root(您是否见过许多无需您的意愿就可以将您连接到wifi的应用程序?)

你也可以用 Java,Ex 来执行命令。

Runtime.getRuntime().exec(new String[] { "ls", "\tmp"});

因为您的 java 代码和本机代码在相同的权限上下文中运行,所以在哪里运行它并不重要。希望对您有所帮助。

【讨论】:

  • 关于库是的,我可以在 libNDK1.so 下看到它,我按照此链接编译我的库 mindtherobot.com/blog/452/…
  • 但我需要清单文件中的权限吗?我怎么知道 iwconfig 是否是 android 的合法命令?
  • 您尝试使用“adb”工具执行 iwconfig 命令。您可以使用它像在 linux 中一样获取 shell(console),并尝试通过键入它来执行它。你也可以试试:Runtime.getRuntime().exec(new String[]{"iwconfig"});
  • 此外,来自 AndroidManifest 的权限在 Java 框架中强制执行。在 linux 用户空间中,您的 uid 将是随机的。
  • 而不是从android调用java调用方法,抱歉我不知道什么是'adb'?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多