2017-04-09 4 views
0

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(); 
} 

:)

+0

引数に2つの文字列を渡されました。たとえば 'java/lang/String'は完全修飾クラス名ですが、' String'はそうではありません。また、JNI関数をどこから呼び出しているかによって、関連性があるかもしれません:https://developer.android.com/training/articles/perf-jni.html#faq_FindClass – Michael

+0

しかし、全体的には奇妙に見えます。 2つの 'EditText'で' getText()。toString() 'を呼び出して、それらの文字列を' Calculate'に渡すのはなぜですか? – Michael

+0

私は前に2番目のことを試みましたが、それはうまくいきませんでした。とにかく(最初のテキストボックスからの)1つの文字列を直接計算して渡すと、その値をコピーしてLuckyNumbersProcessを実行すると、書き込み回数が計算されますが、jniの両方の文字列をどのように受け取ることができますか?私はそれらを渡すことができますが、私はそれらを別々の変数として受け取る必要があります。 –

答えて

0

私はそれを得ました、すべてが今働いています。

は、Javaで私はちょうど `FindClass`は_完全-qualified_クラス名でなければなりませんし、ネイティブメソッド

@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()); 
} 
関連する問題