1

我正在编写一个 Android 应用程序。我正在使用 JNI 在 C++ 中实现一些应用程序。有没有办法将 JNI (C++) 代码与 Java Android 代码完全分开?比如创建一个 JNI 项目之类的?因为我的 C++ 代码将成为我将在另一个应用程序中使用的小库。我尝试创建一个 C++ 项目,但无法使用 ndk-build 进行编译。

4

2 回答 2

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 使用一个本机库与另一个库进行接口的想法之外,还可能使用对象工厂机制在运行时连接任意本机函数,只要在编译时设置一个关联 - 请参阅相关答案to C/C++ Reflection and JNI - 一种调用尚未编写的本机代码的方法

于 2012-05-07T05:42:54.997 回答
0

如果您在 C++ 代码中使用 JNI,那么它会绑定到 Android,并且它必须是正确定义的 Android 项目Android.mkApplication.mk(可选)。

如果您不在代码中使用 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)
于 2012-05-07T04:35:18.133 回答