Я новичок в программировании 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);
}
проблема, как представляется, связано с Метод declaration.JNIEXPORT недействительным JNICALL Java_gz_kaiwii_NativeSocketActivity_start (JNIEnv * окр, JClass jclss) неверен, а JNIEXPORT недействительным JNICALL Java_gz_kaiwii_NativeSocketActivity_start (JNIEnv * окр, jobject джо) является ok.but в любом случае, я пока не уверен. Но, когда я меняю его таким образом, он работает нормально! –
Это не может быть прав. Тип «jclass» для второго аргумента - правильный тип, если собственный метод статичен. И вообще - вы не используете этот аргумент, поэтому из-за этого он не может потерпеть крах. –
да, ур rightBbecuase я фактически реорганизую метод по-другому, и он может пройти через эту проблему, хотя это приводит меня к другой проблеме. Пожалуйста, см. Мою новую проблему, http: //stackoverflow.com/questions/11151945/connect- ошибка-в-сокет-программирование через-ndk, спасибо u за помощь! –