0

私は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 := $(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);
}
4

2 に答える 2

1

setContentView ndk エラーの後に onCreate メソッドでボタン参照を作成すると、強制終了はシャットダウン VM のみになります。

于 2013-02-22T15:36:09.377 に答える
0

この場合にこれが必要かどうかはわかりませんが<uses-permission android:name="android.permission.INTERNET" />AndroidManifest.xmlファイルに追加しようとしましたか?

また、クラッシュ時の正確なエラー/例外とコール スタックは何ですか? adb logcatDDMS またはコマンドラインで表示できます。

また、C 関数からの戻り値を確認し、適切なエラー メッセージをログに記録します。そのために使用<android/log.h>します。

于 2012-06-21T07:43:38.187 に答える