Im進入android但不是應用程序本身。我試圖重新創建我的學校作爲Android應用程序與NDK - >MyczkowskiAdam/LuckyNumbersCppCMD 從C++打印輸出到文本字段不是一個問題,但爲了我的程序工作,我必須傳遞兩個字符串(名字& LastName)與從textfield輸入到C++並存儲它們,以便主程序可以解釋它,這就是我真正掙扎着的。NDK:將文本字段值傳遞給C++字符串
在我的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();
}
任何幫助,將不勝感激:)
的參數'FindClass'應該是一個_fully-qualified_類名。例如,'java/lang/String'是完全限定的類名,而'String'不是。另外,根據你從哪裏調用你的JNI函數,這可能是相關的:https://developer.android.com/training/articles/perf-jni.html#faq_FindClass – Michael
雖然整個事情看起來奇怪的設計。爲什麼你不能在你的兩個EditText上調用'getText()。toString()'並將這些字符串傳遞給'Calculate'? – Michael
我之前嘗試了第二件事,但它似乎沒有工作,可能是因爲我錯誤地調用了該方法。無論如何,如果傳遞一個字符串(從第一個文本框)直接計算它的工作和我能夠複製它的值並運行LuckyNumbersProcess,寫數字計算,但我怎麼能在jni中接收這兩個字符串?我可以通過它們,但我需要將它們作爲單獨的變量接收。 –