NDK JNI函数调用

时间:2014-07-10 10:15:51

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

我刚刚开始使用NDK,因为我的Android SDK代码没有给出满意的结果,尽管我从未尝试使用C / C ++进行编码。 到目前为止,我已经生成了两个本机函数的标题fft_transform()convolve()

我想使用编写here的代码。 问题是fft_transform调用其他C函数,并在另一个C函数中调用它自己。

JNIEXPORT void JNICALL Java_com_example_ffttest_FFTActivity_transform
(JNIEnv *env, jobject obj, jdoubleArray real, jdoubleArray imag, jint n)
{
if (n == 0)
    return 1;
else if ((n & (n - 1)) == 0)  // Is power of 2
    return transform_radix2(real, imag, n);
else  // More complicated algorithm for arbitrary sizes
    return transform_bluestein(real, imag, n);
}

我应该按原样声明标头中的非JNI函数,还是将它们更改为JNI函数? 如何在非JNI函数中添加JNI *envjobj obj变量?

例如:

int inverse_transform(double real[], double imag[], size_t n) {
    return Java_com_example_ffttest_FFTActivity_transform(env, obj, imag, real, n);
}

请注意我在开始投票之前从未使用过C / C ++ NDK。

1 个答案:

答案 0 :(得分:2)

  1. Java方法FFTActivity.transform(..)似乎没有返回类型。因此,您不能像以下那样在其JNI实现中返回一些内容:if (n == 0) return 1; 更改Java方法并相应地重新创建/更新JNI标头。

  2. 使用Java_com_example_ffttest_FFTActivity_transform将Java JNI类型转换为您要使用的C / C ++实现中使用的C / C ++类型。检查JNI文档以了解可用的功能(参见例如GetDoubleArrayElements方法)。

  3. 您不应该将常规C / C ++函数与JNI C / C ++函数混淆。一般来说这可能但有点复杂。因此,不应在c / C ++代码中的任何位置调用JNI函数。此方法仅从应用程序的Java端调用。