我在android中創建了一個工作正常的原生應用程序。此應用程序基於套接字編程。所以爲了首先我必須打開那個我想要處理我的數據的端口,然後在需要關閉之後處理代碼。但問題是,因爲我是新的ndk編程,我可以打開和處理相同功能的數據,但我想要一個模塊化的方法。首先我想打開一個函數然後senddata並關閉。爲此我需要創建一些全局變量,以便我可以在其他函數中使用它們。像波紋管:Android原生代碼:無法訪問代碼中的全局變量
#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;
}
現在我有兩個功能:在開放功能開放和送出數據 我正在初始化的SKT和IFR一定的價值。並希望在我的senddata函數中訪問這些數據。但是,當我打印我的日誌時,打開函數工作正常,但sendData函數無法訪問在打開函數中初始化的skt值。默認它即將到來的「0」。請指導我如何實現這一點。
您可以發佈剩餘的代碼嗎? – mbrenon
Plz檢查上面的代碼 – Andy
如果第二次調用** open()**,那麼'skt'的值是多少?是否有一些** close()**函數? –