JNI:java - C //使用全局变量

时间:2015-08-03 10:05:04

标签: java android c java-native-interface

我想知道JNI是否接受使用.cpp中声明的全局变量(以及我创建的类型)。

这将是一个语音识别程序。实际上,我想使用C声明解码器和Java的所有设置来管理Android上的录制内容。我不想在Java上创建一个Decoder类,因为它应该在Android和iOS上使用(我希望有3个独立的部分:

1)设置解码器(仅限C)

2)进行录制和管理线程(仅限Android-java)

3)解码音频(在java中但调用将使用解码器设置的C函数)

示例:

function.cpp:

struct decoder {
    char *model;
};

在function_2.ccp文件中:

decoder *ps;

void set_decoder(char *modelToUse){
    ps->model = modelToUse;
    return;
}

void process(int *buf ) {
    process_raw(ps, buf); // modify buf accordingly to the parameters of ps
    return;
}

char *getHyp (){
    return ps->hyp;
}

void main(){
    ps = set_decoder(var1);

    jclass = android_class = (*env)->FindClass(env,"android/app/nameofactivity");  
    // find method_ID
    jmethodID android_mid = (*env)->GetStaticMethodID(env, android_class, "java_method",String_signature);

    // call method
    jString hyp_java = (*env)->CallIntMethod(env, android_class, android_mid, int samplerate);

EDIT (add these lines) :

const char *hyp_tmp = (*env)->GetStringUTFChars(env, hyp_java, 0);
const char *hyp = hyp_tmp;
printf(hyp_java);

(*env)->ReleaseStringUTFChars(env, hyp_java, hyp_tmp);

//END of EDIT   

}

在java文件中(方法process和getHyp声明为本机方法; read方法是Android的方法): file.java

String java_method(int samplerate){
    int buf[samplerate];
    recorder.read(buf);
    this.process(buf);
    return this.getHyp();
}

有可能吗?

编辑:简而言之,我想知道我是否可以在C中声​​明一个全局变量“ps”然后调用一个java函数来调用其他将使用声明变量“ps”的值的C函数。

0 个答案:

没有答案