JNI:java-C//使用全局变量
我想知道JNI是否接受使用.cpp中声明的全局变量(以及我创建的类型) 这将是一个语音识别程序。事实上,我想用C来声明解码器的所有设置,用Java来管理Android上的录制。我不想在Java上创建解码器类,因为它应该在Android和iOS上同时使用(我希望有3个单独的部分: 1) 设置解码器(仅在C中) 2) 录制和管理线程(仅在Android java中) 3) 解码音频(在java中,但调用将使用解码器设置的C函数) 例如: function.cpp: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 {
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会“记住”这些参数吗?