尽管我从未尝试过使用C / C ++进行编码,但由于我的Android SDK代码无法给出令人满意的结果,所以我才开始使用NDK。
到目前为止,我生成了我的两个本地函数的头文件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。
最佳答案
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端调用此方法。