Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用Android本机方法失败_Android_Native - Fatal编程技术网

调用Android本机方法失败

调用Android本机方法失败,android,native,Android,Native,最近我正在研究android原生方法。我发现了一些奇怪的事情,那就是我只能在MainActivity类中定义和使用本机方法 public class MainActivity extends AppCompatActivity { static { System.loadLibrary("native-lib"); } public final static String EXTRA_MESSAGE = "com.example.myfirstapp.

最近我正在研究android原生方法。我发现了一些奇怪的事情,那就是我只能在MainActivity类中定义和使用本机方法

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

这些应用程序将引发异常。我错过什么了吗

JNI方法签名包含包名和类名。所以不能从不同的类调用相同的函数

尝试创建一个类来连接本机方法。使它们公开和静态。就像下面的片段一样

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

    public static native void stringFromJNIEx();

}
在本机部分,您的方法签名应该是这样的

Java_com_package_appname_NativeInterface_stringFromJNIEx

MainActivity和DisplayMessageActivity都在同一个android项目中。本机代码在其他android库中定义。我想知道为什么本机方法可以在MainActivity中运行,而不能在DisplayMessageActivity中运行。JNI方法签名不仅获取包名,还获取类名。可能是您的本机方法名,如“Java\u com\u package\u appname\u main activity\u stringFromJNIEx”。它包含类名。