Java 在jni中调用PublishProgress-将jni中不断变化的变量分配给textview
我正在使用NDK实现我的android应用程序, 我在我的C代码中有一个无限循环通过套接字发送和接收,然后我将传输的数据存储在一个变量中,该变量与我的java代码共享,现在我需要在textview上在线查看该变量,但我不能,因为循环在C代码中,而不是在doInBackground()中的java中。。。它必须是这样的,所以我想知道如何在我的C代码循环中调用PublishProgress,或者直接从C将变量分配给textviewJava 在jni中调用PublishProgress-将jni中不断变化的变量分配给textview,java,android,c,android-ndk,java-native-interface,Java,Android,C,Android Ndk,Java Native Interface,我正在使用NDK实现我的android应用程序, 我在我的C代码中有一个无限循环通过套接字发送和接收,然后我将传输的数据存储在一个变量中,该变量与我的java代码共享,现在我需要在textview上在线查看该变量,但我不能,因为循环在C代码中,而不是在doInBackground()中的java中。。。它必须是这样的,所以我想知道如何在我的C代码循环中调用PublishProgress,或者直接从C将变量分配给textview public class ClientTask extends As
public class ClientTask extends AsyncTask<Void, Long, String>
{
private TextView textStatus;
private TextView textStatus2;
private InetAddress serverAdress;
long dif; // This is my shared variable between c and java
public native String clientFromJNI();
static {
System.loadLibrary("hello-jni");
}
private static final int PORT = 1234;
public ClientTask(View textStatus,View textStatus2 , InetAddress serverAdress)
{
this.textStatus = (TextView) textStatus;
this.textStatus2 = (TextView) textStatus2;
this.serverAdress = serverAdress;
}
@Override
protected String doInBackground(Void... params)
{
//publishProgress(dif);
/* // I tried this to call publishProgress frequently by another thread but it did't work well
new Thread(new Runnable() {
public void run(){
while (true) {
publishProgress(dif);
}
}
}).start();
*/
return clientFromJNI();
}
@Override
protected void onPostExecute(String result)
{
setTextStatus("CLI: " + result );
}
@Override
protected void onProgressUpdate(Long... progress) {
textStatus2.setText(Long.toString(progress[0]));
// textStatus.setText(Long.toString(progress[0]));
}
我知道在没有NDK的情况下实现这一点很容易,但我需要用C来实现,请帮助我。您可以通过doInBackground()中的API继续轮询C变量,并不断更新textview。最好为此使用一些计划任务。顺便说一句,为什么要在本机中从套接字读取数据?您可以轻松地在Java中完成这项工作,而不会受到性能的影响,因为本机(NDK)代码也在VM中运行。。。这不是我的选择。。。你能给我一个例子,关于在doInBackground()中继续poling C变量吗?正如你在doInBackground内的评论中看到的那样,我试图使用线程调用publishProgress,但它没有正常工作,更新每5分钟发生三次,之后什么都没有。。。。
JNIEXPORT jstring JNICALL
Java_com_example_hellojni_ClientTask_clientFromJNI(JNIEnv* env, jobject obj )
{
jfieldID fid;
jmethodID mid;
jclass myclass;
jclass cls = (*env)->GetObjectClass(env, obj);
fid = (*env)->GetFieldID(env,cls,"dif","J");
// mid = (*env)->GetMethodID(env,cls,"publishProgress","()V");
//I don't know how to get publishProgress if it is possible
int connfd;
short port;
struct sockaddr_in servaddr, cliaddr;
socklen_t cliaddrlen = sizeof(cliaddr);
port=1234;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
servaddr.sin_addr.s_addr = inet_addr("192.168.49.1");
connfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(connfd, (struct sockaddr *) &servaddr,sizeof(servaddr));
long now;
char str[16];
while (1)
{
read(connfd, str, 16 );
sscanf(str,"%lu",&now);
(*env)->SetLongField(env, obj ,fid , now);
//(*env)->CallVoidMethod(env,obj,); I wish here I can call publishProgress but I don't know how, please help me!
}
close (connfd);
return (*env)->NewStringUTF(env, str);
}