#define GC_APP_NAME_LIT myapp
#define GC_APP_DOMAIN_LIT mydomain
#define GC_NATIVE_FUNCTION_DEF(name,args) GC_NATIVE_FUNCTION_DEF_FINAL(GC_APP_DOMAIN_LIT,GC_APP_NAME_LIT,name,args)
#define GC_NATIVE_FUNCTION_DEF_FINAL(domain,game,name,args) Java_com_##domain_##game_Game_##name args
void GC_NATIVE_FUNCTION_DEF(nativeFunc, (JNIEnv * env, jobject obj)) {
...
}
使用上面的代码,我假设将创建一个具有以下签名的函数。
void Java_com_mydomain_myapp_Game_nativeFunc(JNIEnv * env, jobject obj)) {
...
}
但这似乎不起作用。
另一方面,此设置的更简单版本可以完美运行。
#define GC_NATIVE_FUNCTION_DEF(name,args) Java_com_mydomain_myapp_Game_##name args
void GC_NATIVE_FUNCTION_DEF(nativeFunc, (JNIEnv * env, jobject obj)) {
...
}
。 。 。并根据需要创建函数签名。
需要帮助确定我在这里做错了什么。 。
答案 0 :(得分:3)
test.h
#define GC_APP_NAME_LIT myapp
#define GC_APP_DOMAIN_LIT mydomain
#define CONCAT(a,b,c,d,e,f) a ## b ## c ## d ## e ## f
#define GC_NATIVE_FUNCTION_DEF(name,args) GC_NATIVE_FUNCTION_DEF_FINAL(GC_APP_DOMAIN_LIT,GC_APP_NAME_LIT,name,args)
#define GC_NATIVE_FUNCTION_DEF_FINAL(domain,game,name,args) CONCAT(Java_com_, domain, _, game, _Game_, name) args
void GC_NATIVE_FUNCTION_DEF(nativeFunc, (JNIEnv * env, jobject obj)) {
...
}
让我们通过预处理器.. gcc -E test.h
:
# 1 "test.h"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "test.h"
void Java_com_mydomain_myapp_Game_nativeFunc (JNIEnv * env, jobject obj) {
...
}
答案 1 :(得分:0)
我相信#define
会按顺序处理。尝试在 GC_NATIVE_FUNCTION_DEF_FINAL
之前移动GC_NATIVE_FUNCTION_DEF
。