2013-03-28 36 views
2

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

但我不知道如何以这种方式调用我的库函数。 这些标题和我的函数之间的连接是什么? 我真的现在迷茫,我不知道怎么就这么开始 ,我会心存感激,如果有人能告诉我一步来包装一个C++库(已集成在AOSP)

回答

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++实现。

JNIEXPORT jint JNICALL Java_yourPackageName_yourJavaClass_javaMethod(JNIEnv的* ENV){ //你的C++实现 }

(您必须包括所有必要的进口,把LIB的其他文件中的' jni'文件夹。)

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

也许这不是最聪明的方式来做到这一点,但至少对我来说它工作。 很显然,如果你有库源文件,如果你正在谈论一个静态库,那么我就不能帮你。

+0

非常感谢你的意思是编写一个C++文件来实现这个头文件并复制粘贴库的C++实现 通过复制和注册cc +代码是或我必须将变量的类型更改为jni类型(如jstring,...)? –

+1

我想你只能使用jni类型来传递给java本地方法的变量。对于所有其他方法(以及在方法中声明的变量),您应该可以使用标准的c/C++类型。 也可以在这里查看jni类型描述:http://docs.oracle.com /javase/1.5.0/docs/guide/jni/spec/types.html –