如何通过ndk访问Java静态字段

时间:2012-10-02 11:11:27

标签: android c android-ndk

我想通过NDK C函数修改java SDK中声明的全局变量,例如:

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 noob。 目标平台是Android。 干杯!

1 个答案:

答案 0 :(得分:1)

该方法是静态的,因此它的第二个参数是当前类的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以反映您的。