我想用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(从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类分隔其他帖子中的参数,但没有像整数这样的原语.
请问这样做的正确方法是什么?
谢谢.
我正在尝试创建一个新线程,所以我将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) 我有一个嵌入式Linux系统,包含两个必须实时运行(或软实时)的线程.当使用SCHED_OTHER时,我注意到了很多抖动,但是两个线程总是在它们分配的时间内执行.
我已经在启用了PREEMPT_RT的情况下应用了RT补丁,并且使用SCHED_FIFO运行这两个线程(线程优先级高达~80)导致抖动少得多,总体上要好得多,除了一次和两次线程都错过了他们的截止日期(而不是每10毫秒左右执行一次,他们可能几乎没有时间表!).
我想问一下在嵌入式Linux操作系统上调试linux调度(在RT下)时哪种工具最好.想到了ftrace,但我不知道它是否是最好的和/或唯一的工具.我的目标是找出为什么两个线程偶尔会安排很长时间的原因.
更新:我今天用wakeup_rt运行ftrace.wakeup_rt作为跟踪器没有完成工作:当我的线程最迟运行1000毫秒时,它记录的最大延迟为5毫秒.也许这不是调度程序问题?你会推荐ftrace中的其他跟踪器吗?
我有一个使用 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?
请问有人有什么建议吗?
非常感谢!
我遇到了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) 我试图在我的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)
对于那个很抱歉!
我试图在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时,它不应该进入最后一个但是它会进入.
我不明白为什么会这样.
有谁知道吗?
非常感谢你.
大家好,
我有一个很长的数组,我想写入.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或任何记事本/文本编辑器读取它,它看起来像垃圾(我相信它写的是字节).
有人请让我知道如何解决我的问题吗?
非常感谢你!
我正在使用一个使用结构来表示数组的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(最低有效字节)?
我有一个显示图像的按钮。
当鼠标悬停在鼠标顶部时,我想显示一些文本(就像任何桌面图标一样,甚至HTML页面上的图像)。
我不确定是否有这样做的工具,通过查看GtkButton类找不到任何工具。
请问有人将鼠标悬停在按钮上方时如何设置文本标签吗?
非常感谢你!
android ×3
gtk ×2
java ×2
bash ×1
c ×1
c++ ×1
compilation ×1
file ×1
hex ×1
ip ×1
linux-kernel ×1
linux-rt ×1
long-integer ×1
methods ×1
opencv ×1
scheduling ×1
sdl ×1
ubuntu ×1
wifi ×1