Java 在jni中调用PublishProgress-将jni中不断变化的变量分配给textview

Java 在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

我正在使用NDK实现我的android应用程序, 我在我的C代码中有一个无限循环通过套接字发送和接收,然后我将传输的数据存储在一个变量中,该变量与我的java代码共享,现在我需要在textview上在线查看该变量,但我不能,因为循环在C代码中,而不是在doInBackground()中的java中。。。它必须是这样的,所以我想知道如何在我的C代码循环中调用PublishProgress,或者直接从C将变量分配给textview

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