2016-11-25 3 views
2

Недавно я работаю над собственным методом android. Я нашел что-то странное, что я могу только определить и использовать собственный метод в классе MainActivity.Вызов основного метода на базе Android

public class MainActivity extends AppCompatActivity { 

    static { 
     System.loadLibrary("native-lib"); 
    } 

    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"; 
    private static final int REQUEST_FINE_LOCATION=0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //registerForContextMenu(); 
     stringFromJNIEx(); 
    } 

    public native String stringFromJNIEx(); 
..... 
} 

Когда я пытаюсь вызвать один и тот же метод в другом классе

public class DisplayMessageActivity extends Activity { 

    static { 
     System.loadLibrary("native-lib"); 
    } 

    private MyGLSurfaceView mGLView; 

    public static String qrCode=""; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Intent intent = getIntent(); 
     String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); 
     qrCode=message; 

     mGLView = new MyGLSurfaceView(this); 
     setContentView(mGLView); 

     registerForContextMenu(mGLView); 

     stringFromJNIEx(); 
} 

Приложение сгенерирует исключение. Мне что-то не хватает?

ответ

1

Подписи метода JNI содержат имя пакета и имя класса. Таким образом, вы не можете вызывать одну и ту же функцию из разных классов.

Попробуйте создать класс для взаимодействия с собственными методами. Сделайте их общедоступными и статичными. Как и следующие фрагменты.

public class NativeInterface { 
    static { 
     System.loadLibrary("native-lib"); 
    } 

    public static native void stringFromJNIEx(); 

} 

В исходной части ваша подпись метода должна быть такой:

Java_com_package_appname_NativeInterface_stringFromJNIEx 
+0

Оба объекта MainActivity и DisplayMessageActivity находятся в одном проекте андроида. Нативный код определяется в другой библиотеке Android. Интересно, почему собственный метод можно запустить в MainActivity, но не в DisplayMessageActivity. – user976385

+0

Подпись метода JNI не просто получает имя пакета, но также получает имя класса. Возможно, ваше собственное имя метода похоже на «Java_com_package_appname_MainActivity_stringFromJNIEx». Он содержит имя класса. – mcemilg

+0

Большое спасибо! Он работает сейчас! Ты действительно делаешь мой день! – user976385

Смежные вопросы