JNI编码,从Java到C
JNI coding, from Java to C
我在 Java 中有一段代码需要使用 JNI 并用 C 编写。
此方法是从另一个 class 调用的,因此 'newName' 是从另一个 class 传递给它的。我还有一个播放器 class,它有一个设置播放器名称的方法。然后我 return 一个字符串,包含 'newName' 和 'dodMap.getGoal()' ,它在另一个 class.
中定义
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 class 'javah' 并得到了这个:
JNIEXPORT jstring JNICALL Java_gameLogic_clientHello (JNIEnv *, jobject, jstring, jobject);
我知道如何处理字符串,但是我不知道如何处理播放器对象以及如何调用 dodMap.getGoal();
如有任何帮助,我们将不胜感激。
如果您必须通过 JNI 访问 Java 对象的字段和方法——这似乎是练习的目的——那么您需要熟悉一下与 JNI docs。它们包含您所询问的确切类型的示例,以及所有 JNI 函数的参考,以及使用 JNI 需要了解的总体信息。
您需要的一些 JNI 函数是:
GetFieldId()
and GetObjectField()
检索指向 dodMap
的指针
GetObjectClass()
, GetMethodId()
, and CallVoidMethod()
调用 player.setName()
(假设该方法 returns void
;否则其他 Call<Type>Method()
函数之一将需要)。
CallObjectMethod()
(或另一个 Call<Type>Methods()
)除了上面的一些调用 dodMap.getGoal()
.
由于代码中的固定字符串没有 Java 字符串可依赖,因此您可能希望使用 C 数组操作来构建 return 值(相反,比方说, 到使用已经讨论过的方法来调用 String.concat()
)。涉及的功能包括
GetStringChars()
, GetStringLength()
, ReleaseStringChars()
, and NewString()
,或者这些的基于 UTF-8 的版本。
请务必注意 jchar
和 char
之间的区别。
您可能已经从我刚刚命名的不同函数的数量中猜到,要求您做的事情既不简单也不有趣(但 是 可行的)。只要有可能,最好设计 JNI 接口,以尽量减少在本机代码中使用 Java 对象的需要。
我在 Java 中有一段代码需要使用 JNI 并用 C 编写。
此方法是从另一个 class 调用的,因此 'newName' 是从另一个 class 传递给它的。我还有一个播放器 class,它有一个设置播放器名称的方法。然后我 return 一个字符串,包含 'newName' 和 'dodMap.getGoal()' ,它在另一个 class.
中定义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 class 'javah' 并得到了这个:
JNIEXPORT jstring JNICALL Java_gameLogic_clientHello (JNIEnv *, jobject, jstring, jobject);
我知道如何处理字符串,但是我不知道如何处理播放器对象以及如何调用 dodMap.getGoal();
如有任何帮助,我们将不胜感激。
如果您必须通过 JNI 访问 Java 对象的字段和方法——这似乎是练习的目的——那么您需要熟悉一下与 JNI docs。它们包含您所询问的确切类型的示例,以及所有 JNI 函数的参考,以及使用 JNI 需要了解的总体信息。
您需要的一些 JNI 函数是:
GetFieldId()
andGetObjectField()
检索指向dodMap
的指针
GetObjectClass()
,GetMethodId()
, andCallVoidMethod()
调用player.setName()
(假设该方法 returnsvoid
;否则其他Call<Type>Method()
函数之一将需要)。CallObjectMethod()
(或另一个Call<Type>Methods()
)除了上面的一些调用dodMap.getGoal()
.
由于代码中的固定字符串没有 Java 字符串可依赖,因此您可能希望使用 C 数组操作来构建 return 值(相反,比方说, 到使用已经讨论过的方法来调用 String.concat()
)。涉及的功能包括
GetStringChars()
,GetStringLength()
,ReleaseStringChars()
, andNewString()
,或者这些的基于 UTF-8 的版本。
请务必注意 jchar
和 char
之间的区别。
您可能已经从我刚刚命名的不同函数的数量中猜到,要求您做的事情既不简单也不有趣(但 是 可行的)。只要有可能,最好设计 JNI 接口,以尽量减少在本机代码中使用 Java 对象的需要。