2013-03-02 23 views
0

我需要我的Android設備上做iwconfig的命令,所以我寫C++代碼和NDK加入它有針對本地方法,這是我的方法:是「iwconfig」命令需要root的android設備嗎?

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 
+0

你期待'exec()'返回嗎? (它通常不) – Hasturkun 2013-03-03 11:10:15

+0

是的,它返回字符串值 – Hana90 2013-03-03 14:39:57

+0

iwconfig是舊的,請使用[iw](http://wireless.kernel.org/en/users/Documentation/iw) - 它是Android用戶空間的一部分。 – yegorich 2013-12-24 09:10:16

回答

1

您所看到的錯誤是「UnsatisfiedLinkError」 - 這意味着你正在做的事情錯了使用JNI。

你編譯你的本地庫嗎?你可以在lib \ armeabi \中看到它嗎? 您是否使用'System.loadLibrary'在Java代碼中加載本機庫?

除此之外,您正在假設iwconfig實際上是Android linux中的有效二進制/命令,並且我擔心大多數情況下iwconfig不存在。

關於權限,我想如果你要查看接口列表,那麼你將有足夠的權限。但是如果你嘗試改變一些東西,它不會給你沒有根(你有沒有看到許多應用程序,可以連接你的WiFi沒有你的意志?)

你也可以執行命令與Java,例如。

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

因爲您的java代碼和本機代碼在相同的權限上下文中運行,所以在哪裏運行它並不重要。希望能幫助到你。

+0

關於庫是的,我可以看到它在libNDK1.so 和我按照此鏈接編譯我的庫http://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by-step/ – Hana90 2013-03-03 17:41:42

+0

但我需要清單文件的權限? 我怎麼知道如果iwconfig是android的合法命令? – Hana90 2013-03-03 17:43:16

+0

java執行命令怎麼樣? – Hana90 2013-03-03 17:43:50