小编Jar*_*ary的帖子

Java获取我的IP地址

我想用Java获取我的Internet IP地址,但是当我的IP地址是192.168.0.xxx时,我一直得到我的本地地址(即:127.0.0.1)

我正在使用这条线:

InetAddress.getLocalHost().getHostAddress();
Run Code Online (Sandbox Code Playgroud)

这似乎是获取IP地址的标准,但它不是我想要的.每个教程都说使用这一行,所以我有点困惑.

谁能告诉我如何获得正确的IP地址?


我正在运行连接到WiFi的设备,而我没有使用任何电缆.我使用ifconfig inet addr给出的IP连接到服务器,我希望得到设备的inet addr.我可以检查服务器端套接字的IP,但是如果设备(客户端)告诉服务器他希望其他设备连接哪个IP,那就更好了.

java ip wifi

27
推荐指数
3
解决办法
7万
查看次数

JNI:在GetMethodID的函数签名中传递多个参数

我试图用Java(从C)执行具有以下签名的函数:

public void execute(int x, int y, int action);
Run Code Online (Sandbox Code Playgroud)

我的问题是在GetMethodID中定义函数签名:

env->GetMethodID(hostClass, "execute", "(I;I;I;)V");
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是:

W/dalvikvm( 1849): Bogus method descriptor: (I;I;I;)V
W/dalvikvm( 1849): Bogus method descriptor: (I;I;I;)V
D/dalvikvm( 1849): GetMethodID: method not found: Lcom/device/client/HostConnection;.execute:(I;I;I;)V
Run Code Online (Sandbox Code Playgroud)

我不知道如何在GetMethodID中指定方法签名(对于3个整数作为参数).我看到人们使用";" 为String和File类分隔其他帖子中的参数,但没有像整数这样的原语.

请问这样做的正确方法是什么?

谢谢.

java-native-interface android

22
推荐指数
1
解决办法
2万
查看次数

Android JNI:GetObjectClass与SIGSEGV崩溃(不是有效的JNI引用)

我正在尝试创建一个新线程,所以我将VM从我的方法初始化(从Java调用)传递到我的新线程.在线程中,我调用AttachCurrentThread并获取JNIEnv*env.

稍后,我尝试用环境调用GetObjectClass并崩溃.我相信这是因为对象可能没有初始化,但我试图调用在包含本机方法的类中定义的方法.我一直在尝试遵循http://java.sun.com/docs/books/jni/html/fldmeth.html的 4.2节(开头).

有点奇怪:我正在测试运行2.2的HTC Dream,下面的代码没有崩溃,但摩托罗拉Droid运行2.2.2它会一直崩溃!

这是我的代码:

C++

JNIEXPORT void JNICALL Java_com_device_client_HostConnection_initialize
  (JNIEnv * env, jobject obj, jint port) {

    JavaVM *vm;
    jint result = env->GetJavaVM(&vm);
    if (result < 0) {
        LOGE("Error using GetJavaVM\n");
        exit(-1);
    }

    struct javaInfo* data = (struct javaInfo*) malloc(sizeof(struct javaInfo));
    data->vm = vm;
    data->javaObjHost = obj;

    pthread_t pth;
    pthread_create(&pth, NULL, startServer, (void *) data);
}
Run Code Online (Sandbox Code Playgroud)

新线程:

void *startServer(void* arg) {
    jclass cls;
    jmethodID mid;
    JNIEnv* env = NULL;

    struct javaInfo* data = (struct javaInfo*) arg;
    JavaVM* …
Run Code Online (Sandbox Code Playgroud)

java-native-interface android

9
推荐指数
1
解决办法
8675
查看次数

Linux中调度程序调试的工具

我有一个嵌入式Linux系统,包含两个必须实时运行(或软实时)的线程.当使用SCHED_OTHER时,我注意到了很多抖动,但是两个线程总是在它们分配的时间内执行.

我已经在启用了PREEMPT_RT的情况下应用了RT补丁,并且使用SCHED_FIFO运行这两个线程(线程优先级高达~80)导致抖动少得多,总体上要好得多,除了一次和两次线程都错过了他们的截止日期(而不是每10毫秒左右执行一次,他们可能几乎没有时间表!).

我想问一下在嵌入式Linux操作系统上调试linux调度(在RT下)时哪种工具最好.想到了ftrace,但我不知道它是否是最好的和/或唯一的工具.我的目标是找出为什么两个线程偶尔会安排很长时间的原因.

更新:我今天用wakeup_rt运行ftrace.wakeup_rt作为跟踪器没有完成工作:当我的线程最迟运行1000毫秒时,它记录的最大延迟为5毫秒.也许这不是调度程序问题?你会推荐ftrace中的其他跟踪器吗?

scheduling linux-kernel embedded-linux linux-rt

6
推荐指数
1
解决办法
506
查看次数

将 SDL 嵌入 GTK+

我有一个使用 GTK+ 来显示一些漂亮的 GUI 的应用程序,但我使用 SDL 在 GTK+ 内显示一个小的 RGB 帧缓冲区

我使用以下代码将 SDL 引入 GTK+:

char SDL_windowhack[32];
sprintf(SDL_windowhack, "SDL_WINDOWID=%ld", GDK_WINDOW_XWINDOW(deviceWindow->window));
putenv(SDL_windowhack);
Run Code Online (Sandbox Code Playgroud)

不幸的是,我也使用 SDL 来处理键盘和鼠标事件。使用 SDL 更新图像的主线程生成以下线程:

void *SDLEvent(void *arg)
{
    SDL_Event event;

    while (1) {
        fprintf(stderr, "Test\n");
        SDL_WaitEvent(&event);
        switch (event.type) {
            /* ... */
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我看到 print 语句执行了两次,然后没有执行。一旦我终止 SDL 用于更新屏幕(显示)的线程,SDLEvent 中的循环就会再次开始快速执行。

在我将 SDL 集成到 GTK+ 之前,这段代码曾经运行良好,所以我认为 GTK+ 可能在某些方面阻止了 SDL?

请问有人有什么建议吗?

非常感谢!

c gtk sdl

5
推荐指数
1
解决办法
5881
查看次数

JNI从C++调用Java方法

我遇到了JNI的问题,调用从C++到Java的方法.

我试图调用一个带有布尔值的void方法.我的java代码如下:

public void setStatus(boolean bool) {
    // Do stuff...
}

public native void initialize(int defaultPort);
Run Code Online (Sandbox Code Playgroud)

在我的C++代码中,我正在创建一个结构来保存env和对象并将其传递给一个线程:

JNIEXPORT void JNICALL Java_com_device_client_HostConnection_initialize
  (JNIEnv * env, jobject obj, jint port)
{
    struct javaInfo* data = (struct javaInfo*) malloc(sizeof(struct javaInfo));
    data->env = env;
    data->javaObjHost = obj;

    pthread_t pth;
    pthread_create(&pth, NULL, startServer, (void *) data);

    free(data);
}
Run Code Online (Sandbox Code Playgroud)

在实际的函数中,我试图获取类,然后是MethodID,然后调用void方法,如下所示:

void *startServer(void* arg) {
    struct javaInfo* data = (struct javaInfo*) arg; 
    JNIEnv* env = data->env;
    jobject javaObjHost = data->javaObjHost;

    cls = env->GetObjectClass(javaObjHost);
    mid = env->GetMethodID(cls, "setStatus", …
Run Code Online (Sandbox Code Playgroud)

methods java-native-interface android

3
推荐指数
1
解决办法
2856
查看次数

Ubuntu上的OpenCV:找不到imwrite

我试图在我的Ubuntu机器上使用OpenCV,但我遇到了一些问题.我想我可能没有获得OpenCV的最新版本,但我不确定这是不是问题.

我使用以下链接在我的Ubuntu 11.10上安装了OpenCV:https://help.ubuntu.com/community/OpenCV

我有以下一些代码:

#include    "cv.h"
using namespace cv;
...
Mat mat(width, height, CV_8UC2, buffer);
imwrite("test.jpg", mat);
Run Code Online (Sandbox Code Playgroud)

include指令和Mat()构造函数工作正常,但我不能让imwrite被编译器识别:

g++ example.cpp -o example -lSDL -lpthread `pkg-config --cflags opencv --libs opencv`
example.cpp:64:40: error: ‘imwrite’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

我在页面上看到我链接到它安装libcv2.1,但当前版本是2.3,我认为这可能是问题.

我查看了synpatic包管理器中另一个版本的openCV,但它是唯一的版本.

任何人都可以让我知道这是否确实是问题,我怎么能轻松升级到最新版本?我之前尝试使用CMake构建OpenCV但是我遇到了正确构建它的问题,所以我决定让apt-get完成工作.

非常感谢你!

编辑:(找到解决方案)

对不起,我刚才意识到这是一个愚蠢的错误,我忘了包含一个头文件:

#include "highgui.h"
Run Code Online (Sandbox Code Playgroud)

对于那个很抱歉!

ubuntu opencv compilation

3
推荐指数
1
解决办法
5459
查看次数

Bash脚本:布尔变量不能正常工作

我试图在Bash脚本中评估一个布尔变量,但它总是返回false.

这是代码:

DEVICE_FOUND=false
tmp=`adb devices | tail -n+2 | awk '{print $1}'`

echo "$tmp" | while read line
do
    if [ "$DEVICE_ID" = "$line" ]
    then
        echo "Found a device"
        DEVICE_FOUND=true
    fi
done

if ! $DEVICE_FOUND
then
    echo "ERROR: The device "$DEVICE_ID" is not connected"
    exit
fi
Run Code Online (Sandbox Code Playgroud)

无论"找到设备"是否被执行,我总是进入if语句.当DEVICE_FOUND = true时,它不应该进入最后一个但是它会进入.

我不明白为什么会这样.

有谁知道吗?

非常感谢你.

bash

3
推荐指数
1
解决办法
2967
查看次数

使用Java将长(原始类型)写入文件

大家好,

我有一个很长的数组,我想写入.txt文件,我以后可以在gedit中打开(每行一个数字).我通过使用System.currentTimeMillis()的两个实例的减法来获取这些值.

我使用以下代码:

BufferedWriter out = new BufferedWriter(new FileWriter("latency.txt"));
for (int i = 0; i < USER_LIMIT; ++i) {
    out.write(latency[i] + "\n");
}
out.close();
Run Code Online (Sandbox Code Playgroud)

查看文件时,我看到:

0
1
1
0
Run Code Online (Sandbox Code Playgroud)

我相信字符串连接将long转换为整数.如果我使用DataOutputStream,那么我无法用gedit或任何记事本/文本编辑器读取它,它看起来像垃圾(我相信它写的是字节).

有人请让我知道如何解决我的问题吗?

非常感谢你!

java file long-integer

2
推荐指数
1
解决办法
1万
查看次数

打印数组与整数为十六进制

我正在使用一个使用结构来表示数组的API(并允许在访问结构时填充该数组).

如果data是struct对象,direction是uint32_t,请运行以下命令:

printf("0x%08X", data->magic);
Run Code Online (Sandbox Code Playgroud)

我得到的值:0xAAAABEEF

直接打印数组时:

printf("0x");
for (int i = 0; i < size; ++i) {
  printf("%02X", payload[i]);
}
Run Code Online (Sandbox Code Playgroud)

我得到的值:0xEFBEAAAA

struct定义如下:

struct Data {
  uint32_t magic;
} __attribute__((packed));
Run Code Online (Sandbox Code Playgroud)

我相信数据变量声明如下:

// Declared and initialized somewhat like this:
uint8_t payload[kMaxSize];
Data* data = reinterpret_cast<Data*>(payload);
data->magic = 0xAAAABEEF;
Run Code Online (Sandbox Code Playgroud)

我很好奇为什么printf没有返回相同的值.是因为机器将数据存储为LSB(最低有效字节)?

c++ hex

2
推荐指数
1
解决办法
38
查看次数

GTK +:当鼠标悬停在按钮上时显示标签

我有一个显示图像的按钮。

当鼠标悬停在鼠标顶部时,我想显示一些文本(就像任何桌面图标一样,甚至HTML页面上的图像)。

我不确定是否有这样做的工具,通过查看GtkButton类找不到任何工具。

请问有人将鼠标悬停在按钮上方时如何设置文本标签吗?

非常感谢你!

gtk

1
推荐指数
1
解决办法
1232
查看次数