Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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
androidndk编程:socket_Android_Linux_Android Emulator_Android Ndk - Fatal编程技术网

androidndk编程:socket

androidndk编程:socket,android,linux,android-emulator,android-ndk,Android,Linux,Android Emulator,Android Ndk,我是新的ndk编程和有一个尝试,使一个项目。 我的项目的目的是构建一个客户端,我可以使用按钮的侦听器调用套接字编程的本地方法。而且,android中已经有服务器在运行。 当我构建它并将其导出为apk时,一切都正常运行。但是,不幸的是,在我安装apk并尝试运行它之后,系统提示:不幸的是,NativeSocket已停止。 下面是我的代码: NativeSocketActivity.java: package gz.kaiwii; import android.app.Activity; impor

我是新的ndk编程和有一个尝试,使一个项目。 我的项目的目的是构建一个客户端,我可以使用按钮的侦听器调用套接字编程的本地方法。而且,android中已经有服务器在运行。 当我构建它并将其导出为apk时,一切都正常运行。但是,不幸的是,在我安装apk并尝试运行它之后,系统提示:不幸的是,NativeSocket已停止。 下面是我的代码: NativeSocketActivity.java:

package gz.kaiwii;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class NativeSocketActivity extends Activity {
    /** Called when the activity is first created. */
    final Button button = (Button) findViewById(R.id.button1);
    /*static*/
    static{
        System.loadLibrary("NativeSocket");
    }
    /*native method stuff*/
    static native void start();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                start();

            }
        });
    }
}
Android.mk:

本地路径:=$(调用我的目录)

NativeSocket.c:

#include <string.h>
#include <jni.h>
/*  Make the necessary includes and set up the variables.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>

JNIEXPORT void JNICALL Java_gz_kaiwii_NativeSocketActivity_start
  (JNIEnv *env, jclass jclss)
{
    int sockfd;
    int len;
    struct sockaddr_un address;
    int result;
    char ch = 'A';

/*  Create a socket for the client.  */

    sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

/*  Name the socket, as agreed with the server.  */

    address.sun_family = AF_UNIX;
    strcpy(address.sun_path, "server_socket");
    len = sizeof(address);

/*  Now connect our socket to the server's socket.  */

    result = connect(sockfd, (struct sockaddr *)&address, len);
/*
    if(result == -1) {
        perror("oops: client1");
        exit(1);
    }
    */

/*  We can now read/write via sockfd.  */

    write(sockfd, &ch, 1);
    read(sockfd, &ch, 1);
    /*
    printf("char from server = %c\n", ch);
    */
    close(sockfd);
}
#包括
#包括
/*进行必要的包含并设置变量*/
#包括
#包括
#包括
#包括
#包括
#包括
JNIEXPORT void JNICALL Java_gz_kaiwii_NativeSocketActivity_启动
(JNIEnv*env,jclassjclss)
{
int-sockfd;
内伦;
结构sockaddr\u联合国地址;
int结果;
char ch='A';
/*为客户端创建套接字*/
sockfd=socket(AF_UNIX,SOCK_流,0);
/*按照与服务器商定的方式命名套接字*/
address.sun_family=AF_UNIX;
strcpy(address.sun_路径,“服务器插座”);
len=sizeof(地址);
/*现在将我们的套接字连接到服务器的套接字*/
结果=连接(sockfd,(结构sockaddr*)和地址,len);
/*
如果(结果==-1){
佩罗尔(“oops:client1”);
出口(1);
}
*/
/*我们现在可以通过sockfd进行读/写*/
写入(sockfd和ch,1);
读取(sockfd和ch,1);
/*
printf(“来自服务器的字符=%c\n”,ch);
*/
关闭(sockfd);
}

我不确定在这种情况下是否需要这样做-但是您是否尝试过将
添加到
AndroidManifest.xml
文件中

另外,崩溃时的确切错误/异常和调用堆栈是什么?您可以在DDMS中查看,也可以在命令行上使用adb logcat查看


另外-验证C函数的返回值并记录相应的错误消息。使用

在setContentView之后,在onCreate方法中创建按钮引用
ndk error从不提供强制关闭仅关闭vm。

问题似乎与方法声明有关。JNIEXPORT void JNICALL Java_gz_kaiwii_NativeSocketActivity_start(JNIEnv*env,jclass jclss)不正确,而JNIEXPORT void JNICALL Java_gz_kaiwii_NativeSocketActivity_start(JNIEnv*env,jobject jo)正确。但无论如何,我还不确定。但是,当我这样改变它时,它运行正常!这不可能是对的。若本机方法是静态的,则第二个参数的“jclass”类型是正确的类型。不管怎样,你没有使用这个参数,所以它不可能因此崩溃。是的,你是对的,因为我实际上用另一种方式重构了这个方法,它可以解决这个问题,尽管它给我带来了另一个问题。请看我的新问题,你的帮助!
#include <string.h>
#include <jni.h>
/*  Make the necessary includes and set up the variables.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>

JNIEXPORT void JNICALL Java_gz_kaiwii_NativeSocketActivity_start
  (JNIEnv *env, jclass jclss)
{
    int sockfd;
    int len;
    struct sockaddr_un address;
    int result;
    char ch = 'A';

/*  Create a socket for the client.  */

    sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

/*  Name the socket, as agreed with the server.  */

    address.sun_family = AF_UNIX;
    strcpy(address.sun_path, "server_socket");
    len = sizeof(address);

/*  Now connect our socket to the server's socket.  */

    result = connect(sockfd, (struct sockaddr *)&address, len);
/*
    if(result == -1) {
        perror("oops: client1");
        exit(1);
    }
    */

/*  We can now read/write via sockfd.  */

    write(sockfd, &ch, 1);
    read(sockfd, &ch, 1);
    /*
    printf("char from server = %c\n", ch);
    */
    close(sockfd);
}