2

このようなNDKアプリケーション用のcファイル(ht_NDK.c)の関数が1つあります。

int heatcon_readtemperature(char* temperature)
   {
    int nret,ok;
    char cmd[3]={'d',0x0d, 0x0a};
    struct pollfd pfd;
    static int i=0;
        char read_temp[255]="banagalore";
    i++;
    memcpy(temperature, &read_temp, i);
    if(i==10)
    i=0;
    return nret;
    }

別のcファイル(second.c)で、以下のように上記の関数を呼び出しています。

jstring
Java_com_example_ndk_ReadData_readData( JNIEnv*  env,
                                      jobject this,jstring printMatter, jint j)
{
   char sz[55] = {0};
   return((*env)->NewStringUTF(env,  heatcon_readtemperature(sz)));       

} 

以下のように私のJavaクラス(ReadData.java)で呼び出す上記の関数

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_read_data);       


        btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                ReadData rd = new ReadData();
                String n = rd.readData();
                Log.i("NDK", "msg" +n);         
            }
        });

       }

   static
    {
        System.loadLibrary("ht");
        System.out.println("loded library");
    }  


      public native int[] readData();

    }    
}

ボタンを押すたびに値がコンソールに出力されるように、すべて問題ありませんが、null 値が出力されます。charJava クラスでデータ型を呼び出す方法。私は何かが欠けていると思います。これを解決するには?

4

1 に答える 1

3

最初の関数は次の 2 つを出力します。

  • int 値を返します (これは初期化されていないため、修正する必要があります)
  • char* 引数を変更します。

Java 文字列 (NewStringUTF) を作成すると、int 戻り値が渡されます。おそらく、代わりに char* 値を渡すつもりでした:

char sz[55] = {0};    
heatcon_readtemperature(sz);
return (env*)->NewStringUTF(env, sz);
于 2012-10-30T06:40:10.553 に答える