簡體   English   中英

NDK:將文本字段值傳遞給c ++字符串

[英]NDK: Pass text field value to c++ string

我進入了android,但沒有進入應用本身。 我正在嘗試使用NDK- > MyczkowskiAdam / LuckyNumbersCppCMD重新創建我的學校作業,作為Android應用程序,從C ++打印輸出到文本字段不是問題,但是為了使我的程序正常工作,我必須傳遞兩個字符串(名字和姓氏)從文本字段到C ++的輸入並存儲它們,以便主程序可以解釋它,這就是Im真正在掙扎的東西。

在我的C ++文件中,我具有將FrNm和LstNm傳遞給的主程序過程:

int LuckyNumbersProcess(std::string FrNm, std::string LstNm) {
    //stuff
    //return LuckyNumber (int)
}

然后,我有運行LuckyNumbersProcess的本機函數,並將LuckyNumber寫入文本字段:

extern "C"
JNIEXPORT jstring JNICALL 
Java_com_android_mycax_luckynumbers_MainActivity_Calculate (JNIEnv *env, 
jobject ) {
    LuckyNumbersProcess(FrNmFromJava, LstNmFromJava);
    std::string sLuckyNumber = NumberToString(LuckyNumber);
    return env->NewStringUTF(sLuckyNumber.c_str());
}

顯示來自文本字段的輸入存儲在FrNmFromJava和LstNmFromJava中,但是我該如何處理?

我試過這種方法:

extern "C"
JNIEXPORT void JNICALL 
Java_com_android_mycax_luckynumbers_MainActivity_GetFirstName (JNIEnv * env, 
jobject jobj) {

    const char *str;

    jclass myclass_class =(jclass) env->NewGlobalRef
            (env->FindClass ("GetFirstNameFromField"));

    // we need the MyClass constructor
    jmethodID constructorID = env->GetMethodID
            (myclass_class, "", "()V");

    // and the sayHello() method
    jmethodID methodID = env->GetMethodID
            (myclass_class, "iFirstName", "()Ljava/lang/String;");

    // instanciate a MyClass object
    jobject myclass_object =  env->NewObject
            (myclass_class, constructorID);

    // call the sayHello() method
    jstring s = (jstring)  env->CallObjectMethod
            (myclass_object, methodID);

    // convert the Java String to use it in C
    str = env->GetStringUTFChars(s, 0);
    //printf("%s" , str);
    FrNmFromJava = str;
    env->ReleaseStringUTFChars(s, str);

}

但是它返回的JNI NewGlobalRef調用帶有未決異常java.lang.ClassNotFoundException:在路徑上找不到類“ GetFirstNameFromField”:

這是我的Java文件:

public class MainActivity extends AppCompatActivity {


// Used to load the 'native-lib' library on application startup.
static {
    System.loadLibrary("luckynumbers");
}

EditText mFirstName;
EditText mLastName;
Button mButton;
GetFirstNameFromField gfn = new GetFirstNameFromField();
GetLastNameFromField gln = new GetLastNameFromField();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mFirstName = (EditText)findViewById(R.id.firstName);
    mLastName = (EditText)findViewById(R.id.lastName);
    mButton = (Button)findViewById(R.id.button);
    mButton.setOnClickListener(
            new View.OnClickListener()
            {
                public void onClick(View view)
                {
                    gfn.iFirstName();
                    gln.iLastName();
                    GetFirstName();
                    GetLastName();
                    TextView tv = (TextView) findViewById(R.id.sample_text);
                    tv.setText(Calculate());
                }
            });
}

public class GetFirstNameFromField {
    public String iFirstName() {
        return mFirstName.getText().toString();
    }
}
public class GetLastNameFromField {
    public String iLastName() {
        return mLastName.getText().toString();
    }
}
/**
 * A native method that is implemented by the 'native-lib' native library,
 * which is packaged with this application.
 */
public native String Calculate();

public native String GetFirstName();

public native String GetLastName();
}

任何幫助,將不勝感激 :)

好的,我明白了,現在一切正常。

在Java中,我只是將兩個字符串傳遞給了本機方法

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mFirstName = (EditText)findViewById(R.id.firstName);
        mLastName = (EditText)findViewById(R.id.lastName);
        mButton = (Button)findViewById(R.id.button);
        mButton.setOnClickListener(
                new View.OnClickListener()
                {
                    public void onClick(View view)
                    {
                        TextView tv = (TextView) findViewById(R.id.sample_text);
                    tv.setText(Calculate(mFirstName.getText().toString(),mLastName.getText().toString()));
                }
            });
    }

    public native String Calculate(String jFirstName, String jLastName);

在C ++中

extern "C"
JNIEXPORT jstring JNICALL 
Java_com_android_mycax_luckynumbers_MainActivity_Calculate (JNIEnv *env, jobject, jstring cFirstName, jstring cLastName) {
    const char *path = env->GetStringUTFChars(cFirstName, NULL);
    const char *path2 = env->GetStringUTFChars(cLastName, NULL);
    FrNmFromJava = ToString(path);
    LstNmFromJava = ToString(path2);
    LuckyNumbersProcess(FrNmFromJava, LstNmFromJava);
    std::string sLuckyNumber = ToString(LuckyNumber);
    ClearAll();
    return env->NewStringUTF(sLuckyNumber.c_str());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM