NDK:将文本字段值传递给 c++ 字符串

NDK: Pass text field value to c++ string

本文关键字:c++ 字符串 值传 字段 文本 NDK      更新时间:2023-10-16

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

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

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

然后我有一个运行 LuckyNumbers Process 并将 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());
}