Android ndk jni自动生成功能

时间:2013-12-04 14:24:15

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

我已经有一个现有的C代码,我在其他项目中使用。 我研究了一种在我的Android应用程序中重用C代码的方法,并且在NDK中得到了解决方案。

但是为了使它工作,我必须创建基本上包装我的C代码的JNI文件。

例如,

这是我的C代码:

multiply.h
int mult(int val1, int val2);

multiple.c
int mult(int val1, int val2) { return val1 * val2; }

然后我必须创建看起来像这样的multiply-jni文件:

multiply-jni.c

#include <jni.h>
#include "multiply.h"

jint Java_com_example_ndktest_NativeLib_mult
(JNIEnv * env, jobject obj, jint value1, jint value2)
{
    return mult(value1, value2);
}

然后我使用ndk-build工具生成共享库。

我的问题是,有没有办法自动生成multiply-jni.c文件?我真的不想手工完成这个,因为C代码可能非常大......

1 个答案:

答案 0 :(得分:2)

您可以尝试解析.h文件并发出.java文件。使用JNI,您可以使用Java中的自然方法设计Java类,然后在C中实现它们。在Java中执行某些实现通常很有帮助,因此您的类可能具有公共接口和私有本机方法声明。将.java文件编译为.class文件后,可以使用javah为JNI实现生成.h文件。

如果您更愿意使用Java完成所有工作,则可以使用JNA。它使用Java类调用JNA库(它本身使用JNI)。 JNAerator可以将.h文件转换为所需的Java代码。要有效地使用JNAerator,您可能希望重写.h文件以包含要在Java中使用的类型和函数。

<强>更新 与JNAerator有点类似的是SWIG。 “SWIG通常用于解析C / C ++接口,并生成......目标语言调用... C / C ++代码所需的'粘合代码'。”

再次简化头文件是有利的。 SWIG还允许您注释C声明以指导它的代码生成。它也使用JNI。