2

NDKC関数を介してJavaSDKで宣言されたグローバルを変更したい。例:

public class NDKTest extends Activity
{
    static int myglobal = 0;

    static { System.loadLibrary("MyCLib"); }
    static public native void incrementmyglobal();
....

およびMyCLib:

#include "NDKTest.h"

JNIEXPORT void JNICALL Java_NDKTest_incrementmyglobal

(JNIEnv * env, jobject jObj)
{
  /*
     this next line is obviously wrong, but illustrates how it would have
     been done had it been a purely C program
  */
  M.myglobal = M.myglobal + 1;
  return;
}

だから私の質問は:

a /問題のある行の正しい構文は何ですか?

b / Cヘッダーファイルはどのように表示されますか?

c / Android.mkファイルはどのように表示されますか?

さまざまな「helloworld」NDKの例をコンパイルして実行できますが、Javaで宣言されたグローバルを変更する方法を示すものは見つかりません。超簡単な例をいただければ幸いです。

Linuxコマンドライン(ant debug)とシンプルなテキストエディター(emacs)を使用してプログラミングしています。私はEclipseを使用していません。何年もの間Cをプログラミングしていて、Javaの初心者です。宛先プラットフォームはAndroidです。乾杯!

4

1 に答える 1

1

メソッドは静的であるため、2番目のパラメーターはjclass現在のオブジェクトポインターではなく、現在のクラスへのポインターです。また、ネイティブメソッドの名前にはパッケージ名が含まれている必要があることに注意してください。

JNIEXPORT void JNICALL Java_com_mypackage_NDKTest_incrementmyglobal 
(JNIEnv * env, jobject jcl) 
{ 
  jfieldID fid = GetStaticFieldID(env, jcl, "myglobal", "I");
  int i = GetStaticIntField(env, jcl, fid);
  SetStaticIntField(env, jcl, fid, i+1);
  return; 
} 

Cヘッダーは必要ありません。Android.mkは、すべてのhelloworldの例のようになりますが、LOCAL_SRC_FILESが変更されています。

于 2012-10-02T12:08:18.433 に答える