我正在编写Android应用程序。我正在使用JNI在C ++中实现一些应用程序。有没有办法真正将JNI(C ++)代码与Java Android代码完全分开?就像创建JNI项目一样?因为我的C ++代码将成为我将在另一个应用程序中使用的小库。我试图创建一个C ++项目,但我无法使用ndk-build进行编译。
答案 0 :(得分:1)
实际上,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使用一个本地lib与另一个本地lib接口的想法之外,在编译时只需设置一个关联,就可以使用对象工厂机制在运行时连接任意本机函数 - 参见C/C++ Reflection and JNI - A method for invoking native code which hasn't been written yet
的相关答案答案 1 :(得分:0)
如果您在C ++代码中使用JNI,那么它将绑定到Android,并且必须是具有正确定义的Android.mk
,Application.mk
(可选)的Android项目。
如果您不在代码中使用JNI API,假设您要创建通用库,则可以编写C ++代码,编译它,像往常一样进行测试,不需要ndk-build
。当您使用库完成编码时,将代码构建为静态库,并且当您想在Android项目中使用此静态库时,请在要使用的静态库中围绕功能编写一些JNI包装器,链接到静态库您Android.mk
中的库,如下所示:
include $(CLEAR_VARS)
LOCAL_MODULE := libgeneric
LOCAL_SRC_FILES := prebuilt/libgeneric.a
include $(PREBUILT_STATIC_LIBRARY)