Android で正常に動作するネイティブ アプリケーションを 1 つ作成しました。このアプリケーションは、ソケット プログラミングに基づいています。そのためには、最初にデータを処理するポートを開き、その後コードを処理する必要があります。しかし、問題は、私は ndk プログラミングが初めてなので、同じ関数でデータを開いて処理することができますが、モジュール式のアプローチが必要です。まず、1 つのオープン関数を作成してから、senddata を作成してクローズします。そのためには、グローバル変数を作成して、他の関数で使用できるようにする必要があります。以下のように:
#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;
}
今私は 2 つの関数を持っています:オープン関数 でopenとsendData私は skt と ifr でいくつかの値を初期化しています。私のsenddata関数でそれらのデータにアクセスしたい。しかし、ログを印刷すると、open 関数は正常に動作していますが、sendData 関数は、open 関数で初期化されている skt 値にアクセスできません。デフォルトは「0」です。どうすればこれを達成できるか教えてください。