Android自体にはインストールされていません。私の学校の仕事をNDKのAndroidアプリとして再作成しようとしています - >MyczkowskiAdam/LuckyNumbersCppCMD C++からテキストフィールドへの出力は問題ありませんが、私のプログラムが動作するためには2つの文字列(FirstName & LastName)テキストフィールドからC++への入力とそれを格納するので、メインプログラムがそれを解釈できるようになり、Imが本当に苦労していることがあります。私はFRNMとLstNmを渡すために持っているメインプログラム処理持つ++ファイル私のCでNDK:テキストフィールドの値をC++の文字列に渡す
:
: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();
}
:)
引数に2つの文字列を渡されました。たとえば 'java/lang/String'は完全修飾クラス名ですが、' String'はそうではありません。また、JNI関数をどこから呼び出しているかによって、関連性があるかもしれません:https://developer.android.com/training/articles/perf-jni.html#faq_FindClass – Michael
しかし、全体的には奇妙に見えます。 2つの 'EditText'で' getText()。toString() 'を呼び出して、それらの文字列を' Calculate'に渡すのはなぜですか? – Michael
私は前に2番目のことを試みましたが、それはうまくいきませんでした。とにかく(最初のテキストボックスからの)1つの文字列を直接計算して渡すと、その値をコピーしてLuckyNumbersProcessを実行すると、書き込み回数が計算されますが、jniの両方の文字列をどのように受け取ることができますか?私はそれらを渡すことができますが、私はそれらを別々の変数として受け取る必要があります。 –