2017-05-30 36 views
0

根据这file完全合格的类签名是Lfully-defined-class。 ex。 String - >Ljava/lang/stringJNI:返回用户定义的java类时使用什么签名?

用户定义的类怎么样?他们是否也被认为是完全定义的类? 例如,我创建了一个类Container。我可以使用"LContainer"作为签名吗?我知道我的其他代码工作时,我使用简单的字符串例如,但是当我用我自己的用户定义的类替换它,出于某种原因,我可能会丢失,它不再工作。

getClass是一种返回Container类型值的静态方法。我的签名是否正确? ()LContainer

jmethodID mid = env->GetStaticMethodID(clazz, "getClass", "()LContainer") 

请让我知道您的想法。在此先感谢

+0

您停止猜测并使用'javap -s'的输出。这绝不是错的。 – EJP

回答

1

Oracle JavaOpenJDK提供javap工具,用JNI签名有助于指出缺少的分号。

例如,要查找probablePrime方法的签名在BigInteger类:

javap -s java.math.BigInteger | grep -A 2 "probablePrime" 

public static java.math.BigInteger probablePrime(int, java.util.Random); 
    descriptor: (ILjava/util/Random;)Ljava/math/BigInteger; 

- 正如与java,提供类路径已编译的.class文件。

虽然这不会直接为您提供类的签名,但确实有一些引用类的方法或字段,因此可以在某处找到类描述符。

+0

谢谢,这帮了很多。 – winux

0

假设Container是包com.contosso,你需要"()Lcom/contosso/Container;"

我不知道在哪里Container是在默认包中,你将如何处理这种情况。最明显的是workround将其移动到一个包:-)

感谢user2543253在规范

+0

如果Container不在任何包装中?我认为LContainer会工作,因为当我测试返回一个整数时,格式()我为我工作。不幸的是LContainer不起作用。 – winux

+1

你最后错过了';'(和OP一样)。 – user2543253

+0

Martin Bonner,就我而言,我的.java文件与我当前工作目录的C++位于同一目录中。您可以设置CLASSPATH“。”然后使用JavaVMOption结构访问其成员选项以分配类路径。现在FindClass需要知道的是类名 – winux

相关问题