2012-10-19 31 views
1

我在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」。請指導我如何實現這一點。

+0

您可以發佈剩餘的代碼嗎? – mbrenon

+0

Plz檢查上面的代碼 – Andy

+0

如果第二次調用** open()**,那麼'skt'的值是多少?是否有一些** close()**函數? –

回答

1

首先,0對於套接字來說是一個非常正確的值。因此,您的全局變量按預期進行訪問。

但是你的代碼需要改進。我在評論中解釋了一些技術問題。但我強烈建議不要像在這段代碼中那樣使用全局變量。處理本機句柄(如指針)的推薦方法是將值返回給Java(它可以是jlong),並在您的JNI函數必須使用此值時將其從Java傳遞迴本機。有些技術允許本地代碼訪問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); 
    } 
}