2013-04-21 95 views
1

我想通过jni将java树形图传递给c。我称之为本地方法:JNI将树形图从java传递到c

public native int getEuklid(TreeMap<int,short[]> map); 
static { 
System.loadLibrary("Euklid"); 
} 

现在在我的c文件中,我想访问地图中的元素。我怎么能做到这一点。这是我c文件中的头文件:

JNIEXPORT int JNICALL 
Java_Main_getEuklid (JNIEnv *env, jobject o, jobject o2) 

其中o2是树形图。我该如何处理像java中的treemap那样的jobject?

编辑:

哪里是我的错?:

JNIEXPORT int JNICALL 
Java_Main_getEuklid (JNIEnv *env, jobject o, jobject o2){ 
jclass cls = env->GetObjectClass(o2) ; 
jmethodID mGetValue = env->GetMethodID(cls, "keySet","()Ljava/util/Set;"); 
jobject value = env->CallObjectMethod(o2, mGetValue) 

我变成了:

In function ‘Java_Main_getEuklid’: 
11: error: request for member ‘GetObjectClass’ in something not a structure or union 
12: error: request for member ‘GetMethodID’ in something not a structure or union 
13: error: request for member ‘CallObjectMethod’ in something not a structure or union 

我在C真正的新和我想要测试的东西,所以我希望你能帮我。

+0

相关:http://stackoverflow.com/questions/4844022/jni-create-hashmap和http://stackoverflow.com/questions/5641499/making-generic-calls-with-java-jni-and-c – Cratylus 2013-04-21 17:38:36

+0

我已经编辑我的文章 – bladepit 2013-04-21 17:52:02

回答

2

我认为这是纯C代码。你应该写类似:

(*env)->GetObjectClass(env, o2) 

换句话说,RTFM,从这里开始http://en.wikipedia.org/wiki/Java_Native_Interface

+0

好的,谢谢,这将解决我的问题上面。我还有一个问题:我编译我的测试程序:gcc -Wall -O10 -o test test.c.它不需要超过一秒钟。如果我测试我创建的库,它非常缓慢。我创建了库:gcc -O10 -I/System/Library/Frameworks/JavaVM.framework/Headers -c -o Euklid.o Euklid.c然后gcc -O10 -dynamiclib -o libeuklid.dylib Euklid.o ..为什么我在使用lib时慢呢? – bladepit 2013-04-22 07:36:10

+1

@bladepit我不知道,也许最好提出另一个问题。我怀疑它发生是因为lib编译使用JDK头文件和libs很多,它可能是相当大的文件。尝试没有优化('-O10'),在开发过程中很好。 – kan 2013-04-23 11:15:01