0

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
4

1 に答える 1

1

表示されているエラーは「UnsatisfiedLinkError」です。これは、JNI を使用して何か間違ったことを行っていることを意味します。

ネイティブ ライブラリをコンパイルしましたか?lib\armeabi\ で確認できますか? 「System.loadLibrary」でネイティブ ライブラリを Java コードにロードしましたか?

これに加えて、iwconfig は実際には Android Linux で有効なバイナリ/コマンドであると仮定していますが、ほとんどの場合、iwconfig はそこにありません。

パーミッションについては、インターフェイス リストをのぞき見するのであれば、十分なパーミッションがあると思います。しかし、何かを変更しようとしても、root なしでは提供されません (意図せずに Wi-Fi に接続できる多くのアプリケーションを見たことがありますか?)

Java,Ex でコマンドを実行することもできます。

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

Java コードとネイティブ コードは同じパーミッション コンテキストで実行されるため、どこで実行しても問題ありません。それが役に立てば幸い。

于 2013-03-03T17:34:36.163 に答える