我有一段 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 函数是:
GetFieldId()
和GetObjectField()
检索指向dodMap
的指针GetObjectClass()
、GetMethodId()
和CallVoidMethod()
来调用player.setName()
(假设该方法返回void
;否则将需要其他Call<Type>Method()
函数之一)。CallObjectMethod()
(或其他Call<Type>Methods()
之一)以及上述一些内容来调用dodMap.getGoal()
。
由于代码中的固定字符串不依赖 Java 字符串,因此您可能希望使用 C 数组操作来构建返回值(而不是使用已经讨论过的方法来调用 String.concat()
)。其中涉及的功能包括
-
GetStringChars()
、GetStringLength()
、ReleaseStringChars()
和NewString()
,或者这些的基于 UTF-8 的版本。
一定要注意 jchar
和 char
之间的区别。
正如您可能从我刚刚命名的不同函数的数量中猜到的那样,您被要求做的事情既不简单也不有趣(但它是可行的)。只要有可能,最好设计 JNI 接口(interface),以尽量减少在 native 代码中使用 Java 对象的需要。
关于java - JNI编码,从Java到C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36801435/