java - JNI编码,从Java到C

标签 java c java-native-interface

我有一段 Java 代码,我需要使用 JNI 并用 C 编写它。

此方法是从另一个类调用的,因此“newName”是从另一个类传递给它的。我还有一个 Player 类,它有一个设置玩家名称的方法。然后我返回一个字符串,其中包含在另一个类中定义的“newName”和“dodMap.getGoal()”。

public class gameLogic implements GameInterface {

private gameMap dodMap;
...


public String clientHello(String newName, Player player) {
    // Change the player name and then say hello to them
    player.setName(newName);
    return "HELLO " + newName + "\nGOAL " + dodMap.getGoal();
}

我对 JNI 做了一些阅读,并创建了一个 .h 类“javah”并得到了这个:

JNIEXPORT jstring JNICALL Java_gameLogic_clientHello (JNIEnv *, jobject, jstring, jobject);

我知道如何处理字符串,但我不知道如何处理玩家对象以及如何调用 dodMap.getGoal();

如有任何帮助,我们将不胜感激。

最佳答案

如果您必须通过 JNI 访问 Java 对象的字段和方法(这似乎是练习的目的),那么您将需要熟悉 JNI docs 。它们包含您所询问的事物类型的示例,以及所有 JNI 函数的引用,以及使用 JNI 所需了解的总体信息。

您需要的一些 JNI 函数是:

由于代码中的固定字符串不依赖 Java 字符串,因此您可能希望使用 C 数组操作来构建返回值(而不是使用已经讨论过的方法来调用 String.concat() )。其中涉及的功能包括

一定要注意 jcharchar 之间的区别。

正如您可能从我刚刚命名的不同函数的数量中猜到的那样,您被要求做的事情既不简单也不有趣(但它可行的)。只要有可能,最好设计 JNI 接口(interface),以尽量减少在 native 代码中使用 Java 对象的需要。

关于java - JNI编码,从Java到C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36801435/

相关文章:

c - 在链表中动态存储字符串

c++ - 允许任何进程发送退出消息

c - 在 Microsoft Windows 平台上进行调试

java - 如何从TypeMirror对象获取类型描述符(JNI风格)String(注解处理)

java - 如何修复将使用 JNI 传输到 Java 的二维数组代码?

java - 从 Java 中的列表创建不同的排列

java - 如何使 Java 组合框中的项目居中

java - 如何在java中将具有1个小数点的浮点值存储为浮点值

android - IndirectReferenceTable Android JNI 崩溃

java - Gradle 任务构建不包括 android 类的 Jar