Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.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
如何将JNI部分与Android应用程序分离?_Android_Java Native Interface - Fatal编程技术网

如何将JNI部分与Android应用程序分离?

如何将JNI部分与Android应用程序分离?,android,java-native-interface,Android,Java Native Interface,我正在写一个Android应用程序。我正在使用JNI实现C++中的一些应用程序。有没有一种方法可以将JNI(C++)代码与javaandroid代码完全分离?比如创建一个JNI项目或者其他什么?因为我的C++代码将变成一个小库,我将在另一个应用程序中使用。我试图创建一个C++项目,但是我不能用NDK Bug .< /P> < P >编译。如果你在C++代码中使用JNI,那么它就绑定到Android,它必须是一个Android项目,它有正确的定义: Android .MK,应用程序。MK(可选)。

我正在写一个Android应用程序。我正在使用JNI实现C++中的一些应用程序。有没有一种方法可以将JNI(C++)代码与javaandroid代码完全分离?比如创建一个JNI项目或者其他什么?因为我的C++代码将变成一个小库,我将在另一个应用程序中使用。我试图创建一个C++项目,但是我不能用NDK Bug .< /P> < P >编译。如果你在C++代码中使用JNI,那么它就绑定到Android,它必须是一个Android项目,它有正确的定义:<代码> Android .MK<代码>,<代码>应用程序。MK<代码>(可选)。p>

如果你不在代码中使用JNIAPI,比如说你想创建一个通用库,你可以编写你的C++代码,编译它,像往常一样测试它,不需要代码< NDK Bug < /Cord>。当您使用库完成编码后,将代码构建为静态库,并且当您希望在Android项目中使用此静态库时,围绕您希望使用的静态库中的功能编写一些JNI包装,链接到

Android.mk
中的静态库,类似这样:

include $(CLEAR_VARS)
LOCAL_MODULE    := libgeneric
LOCAL_SRC_FILES := prebuilt/libgeneric.a
include $(PREBUILT_STATIC_LIBRARY)

如果你在C++代码中使用JNI,那么它就绑定到Android,它必须是一个Android项目,它有正确的定义:<代码> Android .MK<代码>,<代码>应用程序。p>

如果你不在代码中使用JNIAPI,比如说你想创建一个通用库,你可以编写你的C++代码,编译它,像往常一样测试它,不需要代码< NDK Bug < /Cord>。当您使用库完成编码后,将代码构建为静态库,并且当您希望在Android项目中使用此静态库时,围绕您希望使用的静态库中的功能编写一些JNI包装,链接到

Android.mk
中的静态库,类似这样:

include $(CLEAR_VARS)
LOCAL_MODULE    := libgeneric
LOCAL_SRC_FILES := prebuilt/libgeneric.a
include $(PREBUILT_STATIC_LIBRARY)

实际上,Java和本机代码之间的连接相当松散,因为它是通过运行时的方法名来完成的

NDK只是C编译器的一个特殊环境和库。必须生成合适的动态库文件,但这可以使用ndk脚本、使用ndk生成的“独立工具链”来完成,甚至可以在java项目构建之前(或之后,请参见下文)完成、在另一台机器上完成等

通常情况下,.so动态库会被复制到应用程序项目树中的适当位置,以便最终打包到.apk中并安装到设备上,在该设备上可以通过System.loadLibrary()方法自动找到它。但是您可以将其插入到另外完成的.apk(这是一个具有特殊对齐和jarsigner签名的zip文件)中。但实际上,即使是.pak也不是将其发送到设备的唯一方法(尽管这是唯一推荐的方法)-库也可以存储在应用程序的私人文件夹中,并使用System.load()加载,该文件采用完整路径名而不是库名

hotverspicy确实有一点,java代码需要一个本机方法“声明”,用于jni库中实现的内容,这需要与本机函数实现名称中编码的实际包名称相匹配。但是,该包名称不必与java代码的其余部分相同——它可以是可重用的C/C++库的通用名称,它只需要匹配的java包名称中有一个简短的匹配java类文件


但除了Neevek使用一个本机库与另一个本机库进行接口的想法外,还可能使用对象工厂机制在运行时连接任意本机函数,因为在编译时只设置了一个关联-请参阅对

的相关回答,Java和本机代码之间的连接相当松散,因为它是在运行时通过方法的名称完成的

NDK只是C编译器的一个特殊环境和库。必须生成合适的动态库文件,但这可以使用ndk脚本、使用ndk生成的“独立工具链”来完成,甚至可以在java项目构建之前(或之后,请参见下文)完成、在另一台机器上完成等

通常情况下,.so动态库会被复制到应用程序项目树中的适当位置,以便最终打包到.apk中并安装到设备上,在该设备上可以通过System.loadLibrary()方法自动找到它。但是您可以将其插入到另外完成的.apk(这是一个具有特殊对齐和jarsigner签名的zip文件)中。但实际上,即使是.pak也不是将其发送到设备的唯一方法(尽管这是唯一推荐的方法)-库也可以存储在应用程序的私人文件夹中,并使用System.load()加载,该文件采用完整路径名而不是库名

hotverspicy确实有一点,java代码需要一个本机方法“声明”,用于jni库中实现的内容,这需要与本机函数实现名称中编码的实际包名称相匹配。但是,该包名称不必与java代码的其余部分相同——它可以是可重用的C/C++库的通用名称,它只需要匹配的java包名称中有一个简短的匹配java类文件


但除了Neevek使用一个本机库与另一个本机库进行接口的想法之外,还可能使用对象工厂机制在运行时连接任意本机函数,因为在编译时只设置了一个关联-请参见

的相关答案,这根本不是真的。虽然使用类似于Android项目结构的东西运行ndk构建是最容易的,但这并不是构建jni库的唯一方法。或者,你可以有一个只有jni代码的虚拟android项目结构——实际的应用程序可以在别处。这里的“静态库”评论也有点不清楚