java - NDK : Pass text field value to c++ string

标签 java android c++ android-ndk java-native-interface

我喜欢 android,但不喜欢应用程序本身。我正在尝试使用 NDK -> MyczkowskiAdam/LuckyNumbersCppCMD 将我的学校作业重新创建为 Android 应用程序 从 C++ 打印输出到文本字段不是问题,但为了让我的程序工作,我必须将两个字符串(名字和姓氏)从文本字段输入传递到 C++ 并存储它们,以便主程序可以解释它,这就是我的意思真的很挣扎。

在我的 C++ 文件中,我必须将 FrNm 和 LstNm 传递给主程序进程:

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

然后我有运行 LuckyNumbersProcess 并将 LuckyNumber 写入文本字段的 native 函数:

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: Did't find class "GetFirstNameFromField"on path:

这是我的 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());
}

关于java - NDK : Pass text field value to c++ string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43309657/

相关文章:

java - 对 ALARM_SERVICE 的 AlarmManager 进行可疑转换

java - 在 JOptionPane 中显示 JDateChooser

android - 在 Android 中使用 PhoneGap 创建 SQLite 数据库

c++ - 为 cmake 生成的 eclipse 项目链接 boost::program_options 和 Armadillo 之间的错误

c++ - 当您只能在运行时将基类向下转换为子类时,消除 C++ 虚函数

java - 如何对Android应用程序进行基准测试?

java - 如何在java中获取数组中的第一个和最后一个元素?

java - AdMob 在 Phonegap 3 上的 0x00000008(代码=1)处抛出致命信号 11 (SIGSEGV)

java - FloatBuffer 损坏问题

c++ - std::bind 中的 shared_from_this 如何在对象不存在的情况下工作?