3

このコードはC++コードを使用してLinuxコマンドを呼び出しましたが、NDKを介してlibとして使用するように変換するにはどうすればよいですか?.Cファイルのみを使用する例と、C++変数とは異なるJniで使用される変数が表示されます。

このc++コードは、NDKで使用するために変換する必要があります

#include <string>
#include <iostream>
#include <stdio.h>

std::string exec(char* cmd) {
FILE* pipe = popen(cmd, "r");
if (!pipe) return "ERROR";
char buffer[128];
std::string result = "";
while(!feof(pipe)) {
    if(fgets(buffer, 128, pipe) != NULL)
        result += buffer;
}
pclose(pipe);
return result;
}

これは行うのに適していますか?

Android.mk

LOCAL_PATH := $(call my-dir)

 include $(CLEAR_VARS)

 # Here we give our module name and source file(s)
 LOCAL_MODULE    := NDK1
 LOCAL_SRC_FILES := NDK1.cpp
include $(BUILD_SHARED_LIBRARY)

NDK1.cppの場合、ネイティブメソッドがexec(char * cmd)であるとします。

#include <string>
#include <iostream>
#include <stdio.h>
#include <jni.h>

  jstring Java_com_mindtherobot_samples_ndkfoo_MainActivity_exec(JNIEnv*     env, jobject javaThis , Jchar* cmd) {

......... same code above
 return result;

  }

これらのファイルを正しい解決策にする方法は?

4

2 に答える 2

4

ネイティブ メソッド宣言を含む MainActivity Java コードが必要です。あなたがそれを投稿しなかったのか、実装するのを忘れていたのかはわかりません。次のようになります。

public class MainActivity extends Activity
{

    /*Don't forget to load the library!!*/
    static {
        System.loadLibrary("NDK1");
    }

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        // your initialization here...
    }

    public native String exec(String cmd);
}

さらに、g-makulik がコメントで指摘したように、ネイティブ コードで c++ 文字列を返していますが、Java 文字列を返す必要があります。NDK1.cpp ファイルは次のようになります。

#include <string>
#include <iostream>
#include <stdio.h>
#include <jni.h>

std::string exec(char* cmd) {
    FILE* pipe = popen(cmd, "r");
    if (!pipe) return "ERROR";
    char buffer[128];
    std::string result = "";
    while(!feof(pipe)) {
        if(fgets(buffer, 128, pipe) != NULL)
        result += buffer;
    }
    pclose(pipe);
    return result;
}

jstring Java_com_mindtherobot_samples_ndkfoo_MainActivity_exec(JNIEnv* env, jobject javaThis , Jchar* cmd) {
    std::string result = exec(cmd); 
    return (*env)->NewStringUTF(env, result);
}

最後に、ndk-build スクリプトを実行して、コードの共有ライブラリを生成する必要があります。NDK1.cpp ファイルを Android.mk ファイルと同じディレクトリの jni フォルダーに配置してください (別の場所でソースを探すために Android.mk ファイルを変更したくない場合)。Linux を使用している場合 (Windows での動作はわかりません)、Android.mk があるターミナルを開く必要があります。そこでコマンド「ndk-build」を実行する必要があります。すべてが正常であれば、エラーは発生せず、.so ファイルがプロジェクトの libs ファイルにコピーされます。

更新:文字列クラスを使用するには、stl ライブラリを追加する必要があるかもしれません。次の内容で、Application.mk ファイルを Android.mk と同じディレクトリに追加してみてください。

APP_ABI := armeabi armeabi-v7a
APP_STL := gnustl_static
于 2013-03-02T12:25:27.280 に答える