我有一段Java代码,我需要使用JNI并在C中编写它。
此方法是从另一个类调用的,因此'newName'从另一个类传递给它。我还有一个Player类,它有一个设置玩家名称的方法。然后我返回一个String,其中包含'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();
任何帮助都将不胜感激。
答案 0 :(得分:0)
如果您必须通过JNI访问Java对象的字段和方法 - 这似乎是练习的目的 - 那么您将需要熟悉JNI docs。它们包含您所询问的各种事件的示例,以及所有JNI函数的参考,以及使用JNI时需要了解的整体信息。
您需要的一些JNI功能是:
GetFieldId()
和GetObjectField()
检索指向dodMap
GetObjectClass()
,GetMethodId()
和CallVoidMethod()
调用player.setName()
(假设该方法返回void
;否则返回另一个Call<Type>Method()
{{}需要1}}函数。
CallObjectMethod()
(或其中一个Call<Type>Methods()
)除了以上某些内容之外,还可以调用dodMap.getGoal()
。
由于代码中的固定字符串不会依赖Java字符串,因此您可能希望使用C数组操作来构建返回值(相反,使用已经讨论过的方法来调用{ {1}})。这涉及包括
在内的功能GetStringChars()
,GetStringLength()
,ReleaseStringChars()
和NewString()
,或者基于UTF-8的版本。请务必注意String.concat()
和jchar
之间的区别。
正如您可能已经从我刚刚命名的不同功能的数量中猜到的那样,您被要求做的事既不简单也不有趣(但 可行)。在可能的情况下,最好设计JNI接口,以最大限度地减少在本机代码中使用Java对象的需要。