我已成功将一个c ++库添加到android 2.3.6源代码树中。 现在我想包装我的库,以便从java中使用 我在网上搜索了很多关于这样做的步骤,但几乎所有我发现的例子都是你好世界的例子和简单的例子...... 从这些例子中我了解到我必须创建一个java文件,用前缀native来调用我需要的本机函数,然后生成头文件并实现c ++文件。
但我不知道如何以这种方式调用我的库函数。 这些标题和我的函数之间有什么联系..? 我现在真的很困惑,我不知道如何开始 所以,如果有人能告诉我包装c ++库(已经集成在aosp中)的步骤,我将感激不尽。
答案 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
}
基本上你要做的是:
创建您需要的java方法
native int javaMethod();
按照您在找到的链接中看到的步骤创建c ++标题,您将拥有以下内容:
JNIEXPORT jint JNICALL Java_yourPackageName_yourJavaClass_javaMethod(JNIEnv *);
现在您有一个c ++标头,其中包含您需要的所有方法的声明。编写一个实现该头的c ++文件,并复制粘贴库的c ++实现。
JNIEXPORT jint JNICALL Java_yourPackageName_yourJavaClass_javaMethod(JNIEnv * env){ //你的c ++实现 }
(您必须包含所有需要的导入,并将lib的其他文件放在'jni'文件夹中。)
从你的android项目根文件夹执行ndk-build,就是这样。
也许这不是最聪明的方法,但至少对我来说这很有效。 显然,如果您有库源文件,这是有效的,如果您正在谈论静态库,那么我无法帮助您。