Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JNI:java-C//使用全局变量_Java_Android_C_Java Native Interface - Fatal编程技术网

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

JNI:java-C//使用全局变量,java,android,c,java-native-interface,Java,Android,C,Java Native Interface,我想知道JNI是否接受使用.cpp中声明的全局变量(以及我创建的类型) 这将是一个语音识别程序。事实上,我想用C来声明解码器的所有设置,用Java来管理Android上的录制。我不想在Java上创建解码器类,因为它应该在Android和iOS上同时使用(我希望有3个单独的部分: 1) 设置解码器(仅在C中) 2) 录制和管理线程(仅在Android java中) 3) 解码音频(在java中,但调用将使用解码器设置的C函数) 例如: function.cpp: struct decoder {

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

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

1) 设置解码器(仅在C中)

2) 录制和管理线程(仅在Android java中)

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

例如:

function.cpp:

struct decoder {
    char *model;
};
在函数_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函数。

您的JNI函数在哪里?您的
getHyp
函数返回一个
char*
,Java代码将其视为
字符串。
char*
不是
字符串
。此外,共享对象中没有
main
。不过可以有一个
JNI_OnLoad
。嗨!谢谢你的回答。事实上,我的问题是关于用C声明并通过JNI使用的全局变量的表示。我的代码比这复杂一点(但我已经看到我上面的解释不是很清楚)。是的,我知道字符串不是字符*。(我应该使用诸如:const char*hyp_tmp=(*env)->GetStringUTFChars(env,hyp_java,0);const char*hyp=hyp_tmp;//使用字符串(*env)->ReleaseStringUTFChars(env,hyp_java,hyp_tmp);)我只是忘了在我的问题中添加这些行。抱歉。JNI无法阻止您使用全局变量,但有些东西在JNI方法的生命周期之外是无效的,例如
JNIEnv
指针和对对象的本地引用,这些都在JNI规范中描述。好的,谢谢。那么:你认为我可以这样做吗:我用C设置解码器,然后用CallIntMethod调用一个java方法,该方法将使用我以前在C中设置的参数。java会“记住”这些参数吗?你的JNI函数在哪里?您的
getHyp
函数返回一个
char*
,Java代码将其视为
字符串。
char*
不是
字符串
。此外,共享对象中没有
main
。不过可以有一个
JNI_OnLoad
。嗨!谢谢你的回答。事实上,我的问题是关于用C声明并通过JNI使用的全局变量的表示。我的代码比这复杂一点(但我已经看到我上面的解释不是很清楚)。是的,我知道字符串不是字符*。(我应该使用诸如:const char*hyp_tmp=(*env)->GetStringUTFChars(env,hyp_java,0);const char*hyp=hyp_tmp;//使用字符串(*env)->ReleaseStringUTFChars(env,hyp_java,hyp_tmp);)我只是忘了在我的问题中添加这些行。抱歉。JNI无法阻止您使用全局变量,但有些东西在JNI方法的生命周期之外是无效的,例如
JNIEnv
指针和对对象的本地引用,这些都在JNI规范中描述。好的,谢谢。那么:你认为我可以这样做吗:我用C设置解码器,然后用CallIntMethod调用一个java方法,该方法将使用我以前在C中设置的参数。java会“记住”这些参数吗?