jni之:eclipse上添加javah快捷菜单

[size=medium]
要开发jni,需要用到javah工具来生成native方法的头文件,网上很多教程都是在命令行下手动输了来生成的,这边通过eclipse提供的External Tools来将javah添加到eclipse的快捷菜单上,这样就只要点一下eclipse的按钮就可以快速的生成native方法的头文件了。

1.
[img]http://dl2.iteye.com/upload/attachment/0090/1069/99ecddfb-353c-35a8-942c-cf518c35a3d8.png[/img]

2.
[img]http://dl2.iteye.com/upload/attachment/0090/1071/9e96460f-1c6f-3799-8b35-852f0099f67c.png[/img]

3.
[img]http://dl2.iteye.com/upload/attachment/0090/1073/635c960f-795d-3532-bb26-02fb540ec09f.png[/img]

4.
[img]http://dl2.iteye.com/upload/attachment/0090/1075/e917b2ac-779b-3b52-9aae-fff870eefef0.png[/img]

5.
[img]http://dl2.iteye.com/upload/attachment/0090/1077/2e1ced77-e234-3382-aa3f-c65fbacfd8fa.png[/img]

6. 如果这一步中没有GBK编码可以选,那可以先将某个.java文件设为GBK的,然后在回到这里,就会发现有GBK可选了,选中GBK后,再将那个.java文件设回原来的编码。(具体看最后一张图)
[img]http://dl2.iteye.com/upload/attachment/0090/1079/ade8587b-0e28-3221-86fb-e9b4d13c2457.png[/img]

7.如果6中没有GBK可选,可以先将Main.java的编码设为GBK后,再去6的界面选择GBK。然后再将Main.java的编码设回原来的编码。
[img]http://dl2.iteye.com/upload/attachment/0090/1083/c096b652-7ae3-3056-9a80-c4347fc527dc.png[/img]

8.测试javah
[img]http://dl2.iteye.com/upload/attachment/0090/1094/739ad28c-522c-3a52-b6e4-df3033d749f4.png[/img]

[img]http://dl2.iteye.com/upload/attachment/0090/1098/ca25cb11-45ac-3384-92f9-def84ea8d627.png[/img]
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 JNI 中遍历 std::map 的示例代码: ```c++ JNIEXPORT void JNICALL Java_com_example_MapExample_mapIteration(JNIEnv *env, jobject obj, jobject mapObj) { // 获取 Map 的 class 对象 jclass mapClass = env->GetObjectClass(mapObj); // 获取 Map.entrySet() 方法的 ID jmethodID entrySetMethodID = env->GetMethodID(mapClass, "entrySet", "()Ljava/util/Set;"); // 调用 Map.entrySet() 方法获取所有的键值对 jobject entrySetObj = env->CallObjectMethod(mapObj, entrySetMethodID); // 获取 Set 的 class 对象 jclass setClass = env->GetObjectClass(entrySetObj); // 获取 Set.iterator() 方法的 ID jmethodID iteratorMethodID = env->GetMethodID(setClass, "iterator", "()Ljava/util/Iterator;"); // 调用 Set.iterator() 方法获取迭代器 jobject iteratorObj = env->CallObjectMethod(entrySetObj, iteratorMethodID); // 获取 Iterator 的 class 对象 jclass iteratorClass = env->GetObjectClass(iteratorObj); // 获取 Iterator.hasNext() 方法的 ID jmethodID hasNextMethodID = env->GetMethodID(iteratorClass, "hasNext", "()Z"); // 获取 Iterator.next() 方法的 ID jmethodID nextMethodID = env->GetMethodID(iteratorClass, "next", "()Ljava/lang/Object;"); // 遍历 Map 中的所有键值对 while (env->CallBooleanMethod(iteratorObj, hasNextMethodID)) { // 调用 Iterator.next() 方法获取下一个键值对 jobject entryObj = env->CallObjectMethod(iteratorObj, nextMethodID); // 获取 Map.Entry 的 class 对象 jclass entryClass = env->GetObjectClass(entryObj); // 获取 Map.Entry.getKey() 方法的 ID jmethodID getKeyMethodID = env->GetMethodID(entryClass, "getKey", "()Ljava/lang/Object;"); // 获取 Map.Entry.getValue() 方法的 ID jmethodID getValueMethodID = env->GetMethodID(entryClass, "getValue", "()Ljava/lang/Object;"); // 调用 Map.Entry.getKey() 方法获取键 jstring keyObj = (jstring) env->CallObjectMethod(entryObj, getKeyMethodID); // 调用 Map.Entry.getValue() 方法获取值 jstring valueObj = (jstring) env->CallObjectMethod(entryObj, getValueMethodID); // 将键值转换为 C++ 字符串 const char* key = env->GetStringUTFChars(keyObj, NULL); const char* value = env->GetStringUTFChars(valueObj, NULL); // 输出键值对 printf("%s: %s\n", key, value); // 释放字符串所占用的内存 env->ReleaseStringUTFChars(keyObj, key); env->ReleaseStringUTFChars(valueObj, value); } } ``` 这段代码首先获取了 Map 对象的 class 对象,然后获取了 Map.entrySet() 方法的 ID,并调用该方法获取所有的键值对。接着获取了 Set 对象的 class 对象,以及 Set.iterator() 方法的 ID,并调用该方法获取迭代器。然后获取了 Iterator 对象的 class 对象,以及 Iterator.hasNext() 方法和 Iterator.next() 方法的 ID。最后通过迭代器遍历 Map 中的所有键值对,并获取每个键值对的键和值,将其转换为 C++ 字符串后输出。需要注意的是,遍历结束后需要释放字符串所占用的内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值