2013-10-03 51 views
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++中我一直在寻找周围,但无法找到如何正确操纵它。有人会告诉我,我该怎么做?

+0

变化 “(I,I,I)[S” 到 “(IIII)[S”(删除分号,并有四个整形变量来buildN)。 – fadden

+0

谢谢法登,我纠正这些错误,但加载 – alexm

+0

你怎么在logcat中看到,当应用程序仍然崩溃? – fadden

回答

0

那么最后我能使其工作,貌似这个问题是因为未使用的代码,这里的任何方法是完全非自动生成的代码,我有检查的处理时间在Java中的C++工程。 MainActivity.java

package com.mytest.ndktest; 

import android.app.Activity; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

TextView _tvResult; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     _tvResult = (TextView)findViewById(R.id.tvResult); 
    } 

    public void bGo_Click(View view) { 

     long time = System.currentTimeMillis(); 
     FrequencySample.buildJ(1000, 22050, 8192); 
     time = System.currentTimeMillis() - time; 
     _tvResult.append(String.format("\n(%dms)",time)); 

     time = System.currentTimeMillis(); 
     FrequencySample.buildN(1000, 22050, 8192); 
     time = System.currentTimeMillis() - time; 
     _tvResult.append(String.format("\n(%dms)", time)); 

    } 
} 

FrequencySample.java

package com.mytest.ndktest; 

public class FrequencySample { 
    private static int _AMP = 10000; 
    private static double _TWO_PY = 8. * Math.atan(1.); 
    private static double _PHASE = 0.0; 
    private static short[] _SAMPLE_BUFFER; 

    /* Creates a frequency sample 
    * Stores frequency samples in a sample buffer 
    */ 
    public static short[] buildJ(int freq, int sampleRate, int bufferSize) {   
     _SAMPLE_BUFFER = new short[bufferSize]; 
     for(int i = 0; i < bufferSize; i++){ 
      _SAMPLE_BUFFER[i] = (short) (_AMP * Math.sin(_PHASE)); 
      _PHASE += _TWO_PY * freq/sampleRate; 
     } 
     return _SAMPLE_BUFFER; 
    } 

    public static native short[] buildN(int freq, int sampleRate, int bufferSize); 

    static { 
     System.loadLibrary("ndktest"); 
    } 
} 

在JNI目录: ndktest.cpp

#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); 
    } 

    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; 
     } 
    } 
} 

Application.mk

在src目录

APP_ABI := all