Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.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
Java NDK在Android中是如何工作的?NDK、JNI等的使用顺序是什么?_Java_Android_Android Ndk_Jvm_Java Native Interface - Fatal编程技术网

Java NDK在Android中是如何工作的?NDK、JNI等的使用顺序是什么?

Java NDK在Android中是如何工作的?NDK、JNI等的使用顺序是什么?,java,android,android-ndk,jvm,java-native-interface,Java,Android,Android Ndk,Jvm,Java Native Interface,在android项目中,Java、NDK、JNI、JVM、C/C++代码等是如何相互关联的 我想知道会发生什么,例如Java代码运行NDK方法,NDK使用JNI库,或者发生什么。还有NDK和JNI之间的区别是什么 很抱歉,如果这个问题措辞不当,我只是在Android项目中如何实现NDK方面遇到了困难。NDK用于将C/C++/asm代码编译成二进制文件。你可以用NDK做很多事情,比如编译可执行文件,静态预编译。。。但最终,在Android应用程序的上下文中,您将获得一个或多个.so文件(共享对象库

在android项目中,Java、NDK、JNI、JVM、C/C++代码等是如何相互关联的

我想知道会发生什么,例如Java代码运行NDK方法,NDK使用JNI库,或者发生什么。还有NDK和JNI之间的区别是什么


很抱歉,如果这个问题措辞不当,我只是在Android项目中如何实现NDK方面遇到了困难。NDK用于将C/C++/asm代码编译成二进制文件。你可以用NDK做很多事情,比如编译可执行文件,静态预编译。。。但最终,在Android应用程序的上下文中,您将获得一个或多个.so文件(共享对象库)

您可以从Java加载这样的.so文件和在其中实现的映射函数。有一种特定的情况,Android应用程序项目只包含C/C++代码(请参阅NDK中的本机活动示例),但这仍然是相同的原则:。因此文件加载在ART或Dalvik上下文中

Android应用程序中的任何内容都是在Dalvik虚拟机或ART的上下文中执行的。为了将C/C++代码与此环境集成,您使用JNI(Java本机接口)

首先从JNI机制使用JNI:加载.so文件时,如果存在JNI_OnLoad()函数,则调用该文件的JNI_OnLoad()函数,并将以Java_开头的函数映射到相应的Java方法。这些方法将在Java类中声明,并使用关键字native指定它们的实现来自.so文件。使用System.loadLibrary()加载.so文件,通常从Java类的静态块加载,该类的方法声明为本机

在运行时,当Java执行到达一个实现为本机的方法时,即在.so文件中,并且该.so文件已加载,则直接执行该本机实现。当它返回时,Java代码继续执行

JNI还为您提供了JNI.h头,它为您提供了访问Java环境(JavaVM*,JNIEnv*)的方法,因此您可以操作、创建和访问Java原语(jint,jlong…),对象(jobject,jclass…),异常(jthrowable),等等

要使用System.loadLibrary正确打包、安装和加载,.so文件必须放在特定位置:

  • eclipse项目内部的libs/CPU\u ABI

  • jniLibs/CPU\u ABI安卓工作室项目内部

  • AAR内部的jni/CPU\u ABI

当应用程序打包为APK时,lib位于其lib/CPU\u ABI文件夹中


在安装过程中,目标平台的LIB被安装到可能的副本上的nativeLibraryPath中。非常感谢,这正是我想要的,你选择的所有拱门什么时候开始编译?用户安装应用程序时是否会发生这种情况?或者apk是否包含您选择的所有arch/abi的所有.so文件?编译.so文件发生在应用程序发布之前。您可以有一个包含零(纯Java)的APK,一组或多组.so文件,用于您想要支持的arch/abi。