我想通过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。 干杯!
答案 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以反映您的。