public String getJNITypeName(boolean usePartialSpec) {
        if (needsProxy() == true) {
            return "::" + namespace + "::" + getCPPClassName() + "Proxy";
        }

        if (getFullyQualifiedClassName().equals("java.lang.String") == true) {
            return "::net::sourceforge::jnipp::JStringHelper";
        }

        if (isArray() == true && componentType.isPrimitive() == true) {
            return "::net::sourceforge::jnipp::J"
                    + Character.toUpperCase(componentType.getClassName().charAt(0))
                    + componentType.getClassName().substring(1)
                    + "ArrayHelper<" + arrayDims + ">";
        }

        if (isArray() == true && componentType.needsProxy() == true) {
            if (usePartialSpec == true) {
                return "::net::sourceforge::jnipp::ProxyArray< " + componentType.getJNITypeName(usePartialSpec) + ", " + arrayDims + " >";
            } else {
                return "::net::sourceforge::jnipp::PA<" + componentType.getJNITypeName(usePartialSpec) + ">::ProxyArray<" + arrayDims + ">";
            }
        }

        if (isArray() == true && componentType.getFullyQualifiedClassName().equals("java.lang.String") == true) {
            return "::net::sourceforge::jnipp::JStringHelperArray<" + arrayDims + ">";
        }

        return getPlainJNITypeName();
    }