我刚刚开始使用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 *env
和jobj 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。
答案 0 :(得分:2)
Java方法FFTActivity.transform(..)似乎没有返回类型。因此,您不能像以下那样在其JNI实现中返回一些内容:if (n == 0) return 1;
更改Java方法并相应地重新创建/更新JNI标头。
使用Java_com_example_ffttest_FFTActivity_transform将Java JNI类型转换为您要使用的C / C ++实现中使用的C / C ++类型。检查JNI文档以了解可用的功能(参见例如GetDoubleArrayElements方法)。
您不应该将常规C / C ++函数与JNI C / C ++函数混淆。一般来说这可能但有点复杂。因此,不应在c / C ++代码中的任何位置调用JNI函数。此方法仅从应用程序的Java端调用。