1

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 つの関数を持っています:オープン関数 でopensendData私は skt と ifr でいくつかの値を初期化しています。私のsenddata関数でそれらのデータにアクセスしたい。しかし、ログを印刷すると、open 関数は正常に動作していますが、sendData 関数は、open 関数で初期化されている skt 値にアクセスできません。デフォルトは「0」です。どうすればこれを達成できるか教えてください。

4

1 に答える 1

1

まず第一に0、ソケットの完全に正しい値です。したがって、グローバル変数は期待どおりにアクセスされます。

ただし、コードには改善が必要です。コメントで説明したいくつかの技術的な問題。ただし、このスニペットのようにグローバル変数を使用しないことを強くお勧めします。ネイティブ ハンドル (ポインタなど) を処理するための推奨される方法は、Java に値を返し ( jlong. ネイティブコードが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);
    }
}
于 2012-10-23T21:30:17.213 に答える