0
我有一个程序,使一个频率的样品,并返回在很短的阵列的样品缓冲液JNI封装定义,Java代码是这样的:为短阵
private static int _AMP = 10000;
private static double _TWO_PY = 8. * Math.atan(1.);
private static double _PHASE = 0.0;
private static short[] sampleBuffer;
public static short[] buildJ(int freq, int sampleRate, int bufferSize) {
sampleBuffer = new short[bufferSize];
for(int i = 0; i < bufferSize; i++){
sampleBuffer[i] = (short) (_AMP * Math.sin(_PHASE));
_PHASE += _TWO_PY * freq/sampleRate;
}
return sampleBuffer;
}
现在我一直在尝试进行本地并使用NDK什么我迄今所做做同样的程序是这样的:
#include <jni.h>
#include <math.h>
namespace com_mytest_ndktest {
static int _AMP = 10000;
static double _TWO_PY = 8. * atan(1.0);
static double _PHASE = 0.0;
static jshortArray build(JNIEnv *env,int freq, int sampleRate, int bufferSize) {
short sampleBuffer[bufferSize];
for(int i = 0; i < bufferSize; i++){
sampleBuffer[i] = (_AMP * sin(_PHASE));
_PHASE += _TWO_PY * freq/sampleRate;
}
jshortArray retval = env->NewShortArray(bufferSize);
env->SetShortArrayRegion(retval,0,bufferSize,sampleBuffer);
return retval;
}
//JNI Wrapper
static jshortArray buildN(JNIEnv *env, jclass clazz, jint freq, jint sampleRate, jint bufferSize) {
return build(env, freq, sampleRate, bufferSize, audioIntensity);
}
static JNINativeMethod method_table[] = {
{ "buildN", "(III)[S", (void *) buildN }
};
using namespace com_mytest_ndktest;
extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return -1;
} else {
jclass clazz = env->FindClass("com/mytest/ndktest/FrequencySample");
if (clazz) {
env->RegisterNatives(clazz, method_table, sizeof(method_table)/sizeof(method_table[0]));
env->DeleteLocalRef(clazz);
return JNI_VERSION_1_6;
} else {
return -1;
}
}
}加载C++库时
应用程序崩溃,我相信操纵笑时,错误的是rt数组在C++中我一直在寻找周围,但无法找到如何正确操纵它。有人会告诉我,我该怎么做?
变化 “(I,I,I)[S” 到 “(IIII)[S”(删除分号,并有四个整形变量来buildN)。 – fadden
谢谢法登,我纠正这些错误,但加载 – alexm
你怎么在logcat中看到,当应用程序仍然崩溃? – fadden