Java NDK JNI函数调用

Java NDK JNI函数调用,java,android,android-ndk,java-native-interface,Java,Android,Android Ndk,Java Native Interface,我刚开始使用NDK,因为我的Android SDK代码没有给出令人满意的结果,尽管我从未尝试过用C/C++编写代码。 到目前为止,我生成了两个本机函数的头,fft\u transform()和convalve() 我想把代码的用法写下来。 问题是,fft\u transform调用其他C函数,并在另一个C函数中调用自身 JNIEXPORT void JNICALL Java_com_example_ffttest_FFTActivity_transform (JNIEnv *env, jobje

我刚开始使用NDK,因为我的Android SDK代码没有给出令人满意的结果,尽管我从未尝试过用C/C++编写代码。 到目前为止,我生成了两个本机函数的头,
fft\u transform()
convalve()

我想把代码的用法写下来。 问题是,
fft\u 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)返回1
    更改Java方法并相应地重新创建/更新JNI头

  • 使用Java_com_example_ffttest_FFTActivity_transform将Java JNI类型转换为要使用的C/C++实现中使用的C/C++类型。检查JNI文档中的可用函数(参见例如GetDoubleArrayElements方法)

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


  • 你是想把结果从C++发送回java吗?是的,卷积的结果会被发送回java。算法的java版本对你来说不够快?但那是很久以前的事了。现在,它工作得很好:)谢谢你的澄清@Robert,所以现在我需要自己“重写”函数。我也不能在另一个JNI函数中调用JNI函数?这应该是可能的,但只有在少数情况下才有意义。最好以这种方式处理它,以便在从JNI函数调用的普通C/C++函数中实现功能。