2012-06-21 2 views
0

Я новичок в программировании ndk и стараюсь сделать проект. Целью моего проекта является создание клиента, в котором я могу использовать прослушиватель кнопки для вызова собственного метода программирования сокетов. И есть сервер, уже запущенный в андроиде. И все работает нормально, когда я его создаю и экспортирую как apk. Но, к сожалению, после того, как я установил apk и попытаюсь запустить его. Системная подсказка: К сожалению, NativeSocket остановился. И следующий мой код: NativeSocketActivity.java:android ndk programming: socket

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: = $ (назовем мой-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); 
} 

ответ

0

Я не уверен, что это необходимо в этом случае - но у вас есть u попытался добавить <uses-permission android:name="android.permission.INTERNET" /> в ваш файл AndroidManifest.xml?

Также какова точная ошибка/исключение и стек вызовов при сбое? Вы можете просмотреть его в DDMS или с adb logcat на командной строке.

Также - проверить возвращаемые значения из функций C и записать соответствующее сообщение об ошибке. Используйте для этого <android/log.h>.

+0

проблема, как представляется, связано с Метод declaration.JNIEXPORT недействительным JNICALL Java_gz_kaiwii_NativeSocketActivity_start (JNIEnv * окр, JClass jclss) неверен, а JNIEXPORT недействительным JNICALL Java_gz_kaiwii_NativeSocketActivity_start (JNIEnv * окр, jobject джо) является ok.but в любом случае, я пока не уверен. Но, когда я меняю его таким образом, он работает нормально! –

+0

Это не может быть прав. Тип «jclass» для второго аргумента - правильный тип, если собственный метод статичен. И вообще - вы не используете этот аргумент, поэтому из-за этого он не может потерпеть крах. –

+0

да, ур rightBbecuase я фактически реорганизую метод по-другому, и он может пройти через эту проблему, хотя это приводит меня к другой проблеме. Пожалуйста, см. Мою новую проблему, http: //stackoverflow.com/questions/11151945/connect- ошибка-в-сокет-программирование через-ndk, спасибо u за помощь! –

0

Вы создаете ссылку на кнопку в методе onCreate после setContentView Ошибка ndk никогда не дает силу закрыть только shutdown vm.