【问题标题】:android ndk programming:socketandroid ndk 编程:socket
【发布时间】:2012-06-23 09:34:30
【问题描述】:

我是 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:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := NativeSocket
### Add all source file names to be included in lib separated by a whitespace
LOCAL_SRC_FILES := NativeSocket.c

include $(BUILD_SHARED_LIBRARY)

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

【问题讨论】:

    标签: android linux android-emulator android-ndk


    【解决方案1】:

    在 setContentView 之后在 onCreate 方法中创建按钮引用 ndk 错误永远不会强制关闭,只会关闭虚拟机。

    【讨论】:

      【解决方案2】:

      我不确定在这种情况下是否需要这样做 - 但您是否尝试将 &lt;uses-permission android:name="android.permission.INTERNET" /&gt; 添加到您的 AndroidManifest.xml 文件中?

      还有什么是确切的错误/异常以及崩溃时的调用堆栈?您可以在 DDMS 中查看它或在命令行中使用adb logcat

      另外 - 验证 C 函数的返回值并记录适当的错误消息。为此使用&lt;android/log.h&gt;

      【讨论】:

      • 问题似乎与方法声明有关。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”类型是正确的类型。无论如何 - 你没有使用这个参数,所以它不可能因此而崩溃。
      • 是的,你是对的,因为我实际上以另一种方式重构了该方法,它可以解决这个问题,尽管它给我带来了另一个问题。请查看我的新问题,stackoverflow.com/questions/11151945/…你寻求帮助!
      猜你喜欢
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      相关资源
      最近更新 更多