gpt4 book ai didi

Android native 代码 : not able to access global variable in code

转载 作者:行者123 更新时间:2023-11-30 03:58:23 24 4
gpt4 key购买 nike

我已经在 android 中创建了一个运行良好的 native 应用程序。此应用程序基于套接字编程。所以首先我必须打开我想要处理我的数据的那个端口,然后处理代码之后需要关闭。但问题是,由于我是 ndk 编程的新手,我能够以相同的功能打开和处理数据,但我想要一种模块化方法。首先,我想创建一个打开函数,然后发送数据并关闭。为此,我需要创建一些全局变量,以便我可以在我的其他函数中使用它们。像下面这样:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LOG_TAG "native"
int skt; // i want to use skt and ifr values
struct ifreq ifr;

JNIEXPORT jint JNICALL Java_com_can_demo_NativeControls_Open(JNIEnv * env, jobject obj, jstring port)
{
if ((skt = socket(PF_, SOCK_RAW, _RAW)) < 0) {
LOGI( "socket not opend");
}

strcpy(ifr.ifr_name, port);
if( ioctl(skt, SIOCGIFINDEX, &ifr) < 0)
{
LOGI( "interface not opend");
}

addr._family = AF_;
addr._ifindex = ifr.ifr_ifindex;

if(bind (skt, (struct sockaddr*)&addr, sizeof(addr)) <0 )
{
LOGI( "bind Error");
}
}

JNIEXPORT jint JNICALL Java_com_can_demo_NativeControls_Send(JNIEnv * env, jobject obj, jstring path)
{
const jbyte *str;

frame._id = 0x123;
str = (*env)->GetStringUTFChars(env, path, 0);
strcpy( frame.data, str );
frame.can_dlc = strlen( frame.data );
int bytes_sent = write( skt, &frame, sizeof(frame) );
return bytes_sent;
}

现在我有两个函数:opensendDataopen 函数中,我正在初始化 skt 和 ifr 中的一些值。并想在我的 senddata 函数中访问这些数据。但是当我打印我的日志时,打开功能正常工作但 sendData 功能无法访问在打开功能中初始化的 skt 值。默认它即将到来的“0”。请指导我如何实现这一目标。

最佳答案

首先,0 是一个完全正确的套接字值。因此,您的全局变量已按预期访问。

但是您的代码需要改进。我在评论中解释了一些技术问题。但我强烈建议不要像您在此代码段中那样使用全局变量。处理 native 句柄(例如指针)的推荐方法是将值返回给 Java(可以是 jlong​​),并在 JNI 函数必须使用该值时将其从 Java 传回 native 。有一些技术允许 native 代码访问 Java 对象的字段以设置/检索此类信息,但在像您这样的简单情况下,这是一个过度。这是 Java 中的一个简单示例:

public class NativeControls {

private long _nativeSocket = -1;

private native long Open(String port);

public void open(String port) {
_nativesocket = Open(port);
}

private native int Send(long socket, String path);
public void sendData(String path) {
return Send(_nativesocket, port);
}
}

关于Android native 代码 : not able to access global variable in code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12970200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com