使用jni包装c ++库

时间:2013-03-28 16:46:39

标签: android c++ android-ndk java-native-interface

我已成功将一个c ++库添加到android 2.3.6源代码树中。 现在我想包装我的库,以便从java中使用 我在网上搜索了很多关于这样做的步骤,但几乎所有我发现的例子都是你好世界的例子和简单的例子...... 从这些例子中我了解到我必须创建一个java文件,用前缀native来调用我需要的本机函数,然后生成头文件并实现c ++文件。

但我不知道如何以这种方式调用我的库函数。 这些标题和我的函数之间有什么联系..? 我现在真的很困惑,我不知道如何开始 所以,如果有人能告诉我包装c ++库(已经集成在aosp中)的步骤,我将感激不尽。

2 个答案:

答案 0 :(得分:3)

这是一个非常复杂的问题,可能超出了简短答案的范围。那么,最好的办法可能是引导你找到比你迄今为止找到的更好的文件。

这一系列博文似乎特别有用:http://thebreakfastpost.com/2012/01/21/wrapping-a-c-library-with-jni-introduction/

您还可以找到有用的包装自动生成器。有一个我没有在这里尝试过:http://www.teamdev.com/jniwrapper/features/

答案 1 :(得分:2)

如果我理解你的问题:

假设您有一个使用此方法的c ++库

int cPlusPlusMethod{
  // Your c++ implementation
}

基本上你要做的是:

  1. 创建您需要的java方法

    native int javaMethod();

  2. 按照您在找到的链接中看到的步骤创建c ++标题,您将拥有以下内容:

    JNIEXPORT jint JNICALL Java_yourPackageName_yourJavaClass_javaMethod(JNIEnv *);

  3. 现在您有一个c ++标头,其中包含您需要的所有方法的声明。编写一个实现该头的c ++文件,并复制粘贴库的c ++实现。

  4. JNIEXPORT jint JNICALL Java_yourPackageName_yourJavaClass_javaMethod(JNIEnv * env){   //你的c ++实现 }

    (您必须包含所有需要的导入,并将lib的其他文件放在'jni'文件夹中。)

    从你的android项目根文件夹执行ndk-build,就是这样。

    也许这不是最聪明的方法,但至少对我来说这很有效。 显然,如果您有库源文件,这是有效的,如果您正在谈论静态库,那么我无法帮助您。