2

我想通过 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 菜鸟。目标平台是 Android。干杯!

4

1 回答 1

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 以反映您的。

于 2012-10-02T12:08:18.433 回答