【问题标题】:Android NDK socket creation null pointerAndroid NDK 套接字创建空指针
【发布时间】:2015-05-18 13:18:00
【问题描述】:

为了添加 TCP-socket-options,我需要使用 Android NDK 的 C-sockets 而不是 Java sockets。以下函数由按钮单击事件调用。

当创建这样一个套接字时,系统调用将我引导到一个空指针(见最后的日志输出)。

如日志所示,上面的行被调用(创建套接字)但随后(所以它必须在套接字()调用中),应用程序由于空指针而崩溃,然后才能评估返回价值。

我做错了什么?

#include <jni.h>
#include <string.h>
#include <android/log.h>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define DEBUG_TAG "NDK_AndroidNDK1SampleActivity"

void error(const char *msg)
{
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", msg);
    exit(0);
}


int Java_com_example_ndk1_AndroidNDK1SampleActivity_sendUrgent(JNIEnv * env, jobject this,
        jstring jurl, int portno, jstring jdata, jboolean jSetUrgentFlag)
{

    int sockfd = 0;
    error("Create Socket");
    sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    error("Socket created");
    if (sockfd < 0)
        error("ERROR opening socket");
    return 1;
}



05-18 14:47:54.002  11500-11500/com.example.ndk1 D/NDK_AndroidNDK1SampleActivity﹕ NDK:LC: [Create Socket]
05-18 14:47:54.022     780-1221/? I/WindowState﹕ WIN DEATH: Window{42bde4f8 u0 com.example.ndk1/com.example.ndk1.AndroidNDK1SampleActivity}
05-18 14:47:54.022     780-1222/? I/ActivityManager﹕ Process com.example.ndk1 (pid 11500) has died.
05-18 14:47:54.022     780-1222/? W/ActivityManager﹕ Force removing ActivityRecord{42ae6278 u0 com.example.ndk1/.AndroidNDK1SampleActivity t17}: app died, no saved state
05-18 14:47:54.062     988-1000/? W/Binder﹕ Caught a RuntimeException from the binder stub implementation.
    java.lang.NullPointerException
            at android.inputmethodservice.IInputMethodWrapper.setSessionEnabled(IInputMethodWrapper.java:280)
            at com.android.internal.view.IInputMethod$Stub.onTransact(IInputMethod.java:129)
            at android.os.Binder.execTransact(Binder.java:404)
            at dalvik.system.NativeStart.run(Native Method)


dmesg-log:
<3>[11101.768759] init: untracked pid 11500 exited

【问题讨论】:

  • 您发布的错误消息没有直接指示失败的原因 - 而这仅仅是进程消失的结果。您将不得不在日志中找到信息更丰富的消息,例如本机堆栈跟踪,或者通过检查代码来解决问题。
  • 这正是我的问题...由于 socket() 是一个系统调用,我对其代码没有影响,因此无法对其进行调试。我已经包含了系统日志消息,但它什么也没说。
  • 您应该打印errno,或致电perror(),或在消息中使用strerror()

标签: android c sockets nullpointerexception android-ndk


【解决方案1】:

从 void error() 函数中删除“exit(0)”

【讨论】:

  • 谢谢 - 它奏效了。可能我用的教程不是很好
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
相关资源
最近更新 更多